×

java多线程传输文件

java多线程传输文件(java多线程操作文件)

admin admin 发表于2023-03-28 19:10:07 浏览42 评论0

抢沙发发表评论

本文目录一览:

要用java实现多线程的文件上传该如何去做?

的资源消耗,因此,在进行同类事情,需要进行互相的通讯等等事情的时候,都采用线程来进行处理。

对于只做固定的一件事情(比如:计算1+2+3+...+9999999)来说,其性能上不会比采用单线程的整体效率高,原因是,同时都是要做这么多运算,采用多线程的话,系统在进行线程调度的过程中喙浪费一些资源和时间,从而性能上下降。

那么,多线程是否就没有存在的意义了呢?答案当然不是的。多线程还是有存在的价值的,我们在写输入流输出流,写网络程序等等的时候,都会出现阻塞的情况,如果说,我们不使用多线程的话,从A中读数据出来的时候,A因为没有准备好,而整个程序阻塞了,其他的任何事情都没法进行。如果采用多线程的话,你就不用担心这个问题了。还举个例子:游戏中,如果A角色和B角色采用同一个线程来处理的话,那么,很有可能就会出现只会响应A角色的操作,而B角色就始终被占用了的情况,这样,玩起来肯定就没劲了。-java多线程传输文件

因此,线程是有用的,但也不是随便乱用,乱用的话,可能造成性能的低下,它是有一点的适用范围的,一般我认为:需要响应多个人的事情,从设计上需要考虑同时做一些事情(这些事情很多情况下可能一点关系都没有,也有可能有一些关系的)。-java多线程传输文件

使用多线程的时候,如果某些线程之间涉及到资源共享、互相通讯等等问题的时候,一定得注意线程安全的问题,根据情况看是不是需要使用synchronized关键字。

另外,站长团上有产品团购,便宜有保证

java多线程发送文件和接受文件

打开侦听的端口,一有客户端连接就创建两个新的线程来负责这个连接

一个负责客户端发送的信息(ClientMsgCollectThread 类),

另一个负责通过该Socket发送数据(ServerMsgSendThread )

Server.java代码如下:

/*

* 创建日期 2009-3-7

*

* TODO 要更改此生成的文件的模板,请转至

* 窗口 - 首选项 - Java - 代码样式 - 代码模板

*/

package faue.MutiUser;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

/**

* 服务器端

*

* @author Faue

*/

public class Server extends ServerSocket {

private static final int SERVER_PORT = 10000;

/**

* 构造方法,用于实现连接的监听

*

* @throws IOException

*/

public Server() throws IOException {

super(SERVER_PORT);

try {

while (true) {

Socket socket = super.accept();

new Thread(new ClientMsgCollectThread(socket), "getAndShow"

+ socket.getPort()).start();

new Thread(new ServerMsgSendThread(socket), "send"

+ socket.getPort()).start();

}

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) throws IOException {

new Server();

}

/**

* 该类用于创建接收客户端发来的信息并显示的线程

*

* @author Faue

* @version 1.0.0

*/

class ClientMsgCollectThread implements Runnable {

private Socket client;

private BufferedReader in;

private StringBuffer inputStringBuffer = new StringBuffer("Hello");

/**

* 得到Socket的输入流

*

* @param s

* @throws IOException

*/

public ClientMsgCollectThread(Socket s) throws IOException {

client = s;

in = new BufferedReader(new InputStreamReader(client

.getInputStream(), "GBK"));

}

public void run() {

try {

while (!client.isClosed()) {

inputStringBuffer.delete(0, inputStringBuffer.length());

inputStringBuffer.append(in.readLine());

System.out.println(getMsg(inputStringBuffer.toString()));

}

} catch (IOException e) {

//e.printStackTrace();

System.out.println(client.toString() + " is closed!");

}

}

/**

* 构造显示的字符串

*

* @param line

* @return

*/

private String getMsg(String line) {

return client.toString() + " says:" + line;

}

}

/**

* 该类用于创建发送数据的线程

*

* @author Faue

* @version 1.0.0

*/

class ServerMsgSendThread implements Runnable {

private Socket client;

private PrintWriter out;

private BufferedReader keyboardInput;

private StringBuffer outputStringBuffer = new StringBuffer("Hello");

/**

* 得到键盘的输入流

*

* @param s

* @throws IOException

*/

public ServerMsgSendThread(Socket s) throws IOException {

client = s;

out = new PrintWriter(client.getOutputStream(), true);

keyboardInput = new BufferedReader(new InputStreamReader(System.in));

}

public void run() {

try {

while (!client.isClosed()) {

outputStringBuffer.delete(0, outputStringBuffer.length());

outputStringBuffer.append(keyboardInput.readLine());

out.println(outputStringBuffer.toString());

}

} catch (IOException e) {

//e.printStackTrace();

System.out.println(client.toString() + " is closed!");

}

}

}

}

客户端:

实现基于IP地址的连接,连接后也创建两个线程来实现信息的发送和接收

/*

* 创建日期 2009-3-7

*

*/

package faue.MutiUser;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.PrintWriter;

import java.net.Socket;

/**

* 客户端

*

* @author Faue

*/

public class Client {

private Socket mySocket;

/**

* 创建线程的构造方法

*

* @param IP

* @throws IOException

*/

public Client(String IP) throws IOException {

try {

mySocket = new Socket(IP, 10000);

new Thread(new ServerMsgCollectThread(mySocket), "getAndShow"

+ mySocket.getPort()).start();

new Thread(new ClientMsgSendThread(mySocket), "send"

+ mySocket.getPort()).start();

} catch (IOException e) {

//e.printStackTrace();

System.out.println("Server.IP:" + IP

+ " port:10000 can not be Connected");

}

}

public static void main(String[] args) throws IOException {

try {

new Client(args[0]);

} catch (Exception e) {

System.out.println("输入的IP地址错误");

}

}

/**

* 该类用于创建接收服务端发来的信息并显示的线程

*

* @author Faue

* @version 1.0.0

*/

class ServerMsgCollectThread implements Runnable {

private Socket client;

private BufferedReader in;

private StringBuffer inputStringBuffer = new StringBuffer("Hello");

/**

* 得到Socket的输入流

*

* @param s

* @throws IOException

*/

public ServerMsgCollectThread(Socket s) throws IOException {

client = s;

in = new BufferedReader(new InputStreamReader(client

.getInputStream(), "GBK"));

}

public void run() {

try {

while (!client.isClosed()) {

inputStringBuffer.delete(0, inputStringBuffer.length());

inputStringBuffer.append(in.readLine());

System.out.println(getMsg(inputStringBuffer.toString()));

}

} catch (IOException e) {

//e.printStackTrace();

System.out.println(client.toString() + " is closed!");

System.exit(0);

}

}

/**

* 构造输入字符串

*

* @param line

* @return

*/

private String getMsg(String line) {

return client.toString() + " says:" + line;

}

}

/**

* 该类用于创建发送数据的线程

*

* @author Faue

* @version 1.0.0

*/

class ClientMsgSendThread implements Runnable {

private Socket client;

private PrintWriter out;

private BufferedReader keyboardInput;

private StringBuffer outputStringBuffer = new StringBuffer("Hello");

/**

* 得到键盘的输入流

*

* @param s

* @throws IOException

*/

public ClientMsgSendThread(Socket s) throws IOException {

client = s;

out = new PrintWriter(client.getOutputStream(), true);

keyboardInput = new BufferedReader(new InputStreamReader(System.in));

}

public void run() {

try {

while (!client.isClosed()) {

outputStringBuffer.delete(0, outputStringBuffer.length());

outputStringBuffer.append(keyboardInput.readLine());

out.println(outputStringBuffer.toString());

}

out.println("--- See you, bye! ---");

} catch (IOException e) {

//e.printStackTrace();

System.out.println(client.toString() + " is closed!");

System.exit(0);

}

}

}

}

如果对您有帮助,请记得采纳为满意答案,谢谢!祝您生活愉快!

vaela

java中怎么用多个线程同时对一个文件读取,最终将文件内容保存到一个字节数组中去呢?

多线程读取文件在一块硬盘上没用,瓶颈在硬盘I/O,而不在CPU和内存。读取文件时,CPU不用复杂的计算工作,只是数据传输而已,多线程反而造成磁头来回移动,效率不高。如果是两块以上的硬盘,可以用不同的线程访问不同的硬盘,效率比单线程要高-java多线程传输文件

而且多线程操作同一文件除了效率还会有多线程问题,多个线程同时往数组里存数据还会有线程安全问题,如果不同步处理读取的文件就是错误的。

如果读取的话只能设置每个线程各自读取偏 移量

读取文件大小(比如大小是200K)。 2,启动5个线程,第一个线程读到40,第二个线程跳过40在读到80,总之得合理安排好各个线程读取的大小。这样才能不重复读取。大数据处理框架mapreduce原理和此类似-java多线程传输文件