📄 datasocket.java
字号:
package clienttext;
import java.io.*;
import java.net.*;
import java.util.Vector;
/**
*
* <p>实现从socket从本地传送和接受文件到本地 </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
public class DataSocket {
private InputStream inputStream;
private OutputStream outputStream;
public DataSocket(Socket socket) throws IOException {
this.inputStream = socket.getInputStream();
this.outputStream = socket.getOutputStream();
}
/***********************************************
* <p>将文件发送到socket中</p>
***********************************************/
public void sendFileTo(File file) {
try {
ObjectOutputStream objectOutput = new ObjectOutputStream(outputStream);
byte[] dataFromFile = getBytesFromFile(file); //从文件读取到的数据放到另一个字节数组里
objectOutput.writeObject(dataFromFile); //将文件内容写入对象输出流
objectOutput.flush();
outputStream.close();
}
catch (IOException e) {
System.out.print(e);
}
}
/****************************************************************************
* <p>从socket中接受文件并存储到本地 </p>
*****************************************************************************/
public void receiveFileAndSaveTo(File file) {
try {
ObjectInputStream inputFromServer = new ObjectInputStream(inputStream); //获取输入流
byte[] fileData = (byte[]) inputFromServer.readObject(); //从输入流读取对象到字节数组
FileOutputStream fileOut = new FileOutputStream("file", false); //该文件不可追加
DataOutputStream outputToFile = new DataOutputStream(fileOut); //新建一个写入文件的输出流
outputToFile.write(fileData); //将fileData字节数组中的数据写到新创建的文件中
outputToFile.close();
}
catch (IOException e) {
System.out.print(e);
}
catch (ClassNotFoundException ee) {
System.out.print(ee);
}
}
/****************************************************************************
* <p>将多个文件发送到socket中 </p>
*****************************************************************************/
public void sendFilesTo(Vector v) {
try {
Vector saveTheData=new Vector();
ObjectOutputStream objectOutput = new ObjectOutputStream(outputStream);
//将v中的每个文件转换成相应的字节数组加入到Vector saveTheData中
for(int i=0;i<v.size();i++)
{
saveTheData.add(getBytesFromFile((File) v.get(i)));
}
objectOutput.writeObject(saveTheData);
objectOutput.flush();
outputStream.close();
}
catch (IOException e) {
System.out.print(e);
}
}
/****************************************************************************
* <p>接受多个文件并存储到本地</p>
*****************************************************************************/
public void receiveFilesAndSaveTo(Vector v) {
int i = 0;
try {
ObjectInputStream inputFromServer = new ObjectInputStream(inputStream);
Vector fileData = (Vector) inputFromServer.readObject();
try {
for (i = 0; i < fileData.size(); i++) {
byte[] byteArray = (byte[]) fileData.get(i);
FileOutputStream fileOut = new FileOutputStream(v.get(i).toString(), false);
DataOutputStream outputToFile = new DataOutputStream(fileOut);
outputToFile.write(byteArray);
}
}
//数组越界表示预计要收的文件比实际要收到的文件少
catch (ArrayIndexOutOfBoundsException e) {
System.out.println("miss file" + v.get(i).toString());
}
//如果实际收到的文件比预计的少
if (i < v.size()) {
System.out.print("only ");
for (int j = 0; j < i; j++)
System.out.print(v.get(j).toString() + ",");
System.out.print(" received successful");
}
//outputToFile.close();
}
catch (IOException e) {
System.out.print(e);
}
catch (ClassNotFoundException ee) {
System.out.print(ee);
}
finally {
}
}
/*****************************************************************************
*把本地文件内容读到一个字节数组中
*****************************************************************************/
public static byte[] getBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
long length = file.length();
if (length > Integer.MAX_VALUE) {
System.out.println("This file is too large");
}
byte[] bytes = new byte[ (int) length];
int offset = 0;
int numRead = 0;
while (offset < bytes.length &&
(numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) {
offset += numRead;
}
if (offset < bytes.length) {
throw new IOException("could not completely read file" + file.getName());
}
is.close();
return bytes;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -