當(dāng)然不會有"該路徑下不存在要操作的壓縮文件"的錯誤
成都創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計制作、成都網(wǎng)站制作,集網(wǎng)站策劃、網(wǎng)站設(shè)計、網(wǎng)站制作于一體,網(wǎng)站seo、網(wǎng)站優(yōu)化、網(wǎng)站營銷、軟文發(fā)稿等專業(yè)人才根據(jù)搜索規(guī)律編程設(shè)計,讓網(wǎng)站在運行后,在搜索中有好的表現(xiàn),專業(yè)設(shè)計制作為您帶來效益的網(wǎng)站!讓網(wǎng)站建設(shè)為您創(chuàng)造效益。
因為你沒有直接對文件進行操作,而使用的是ZipEntry
報錯的原因就是ZipEntry entry = file.getEntry("readme.txt"); ?這句返回的ZipEntry對象是空的。
zip壓縮包肯定是對的,但是里面應(yīng)該沒有readme.txt這個文件,所以返回了null,參考下源碼:
/**
*?Returns?the?zip?file?entry?for?the?specified?name,?or?null
*?if?not?found.
*
*?@param?name?the?name?of?the?entry
*?@return?the?zip?file?entry,?or?null?if?not?found
*?@throws?IllegalStateException?if?the?zip?file?has?been?closed
*/
public?ZipEntry?getEntry(String?name)?{
if?(name?==?null)?{
throw?new?NullPointerException("name");
}
long?jzentry?=?0;
synchronized?(this)?{
ensureOpen();
jzentry?=?getEntry(jzfile,?name,?true);
if?(jzentry?!=?0)?{
ZipEntry?ze?=?new?ZipEntry(name,?jzentry);
freeEntry(jzfile,?jzentry);
return?ze;
}
}
return?null;
}
public?class?Server?{??
public?static?void?main(String?args[])?throws?IOException?{??
//為了簡單起見,所有的異常信息都往外拋??
int?port?=?8899;??
//定義一個ServerSocket監(jiān)聽在端口8899上??
ServerSocket?server?=?new?ServerSocket(port);??
//server嘗試接收其他Socket的連接請求,server的accept方法是阻塞式的??
Socket?socket?=?server.accept();??
//跟客戶端建立好連接之后,我們就可以獲取socket的InputStream,并從中讀取客戶端發(fā)過來的信息了。??
Reader?reader?=?new?InputStreamReader(socket.getInputStream());??
char?chars[]?=?new?char[64];??
int?len;??
StringBuilder?sb?=?new?StringBuilder();??
while?((len=reader.read(chars))?!=?-1)?{??
sb.append(new?String(chars,?0,?len));??
}??
System.out.println("from?client:?"?+?sb);??
reader.close();??
socket.close();??
server.close();??
}??
}
服務(wù)端從Socket的InputStream中讀取數(shù)據(jù)的操作也是阻塞式的,如果從輸入流中沒有讀取到數(shù)據(jù)程序會一直在那里不動,直到客戶端往Socket的輸出流中寫入了數(shù)據(jù),或關(guān)閉了Socket的輸出流。當(dāng)然,對于客戶端的Socket也是同樣如此。在操作完以后,整個程序結(jié)束前記得關(guān)閉對應(yīng)的資源,即關(guān)閉對應(yīng)的IO流和Socket。
BufferedWriter bu=new BufferedWriter(new FileWriter("file.txt"));
String filetxt=jTextArea1.getText();
String pp[]=filetxt.split("\n");
for(int i=0;ipp.length;i++){
bu.write(pp[i]);
bu.newLine();
}
bu.flush();
bu.close();
JOptionPane.showMessageDialog(this,"文件保存成功");
//就這樣 放到你按鈕的事件下就可以了 jTextArea1 是文本域 file.txt 是文件名 可以改成絕對路徑
1.TCP/IP協(xié)議要求信息必須在塊(chunk)中發(fā)送和接收,而塊的長度必須是8位的倍數(shù),因此,我們可以認為TCP/IP協(xié)議中傳輸?shù)男畔⑹亲止?jié)序列。如何發(fā)送和解析信息需要一定的應(yīng)用程序協(xié)議。
2.信息編碼:
首先是Java里對基本整型的處理,發(fā)送時,要注意:1)每種數(shù)據(jù)類型的字節(jié)個數(shù);2)這些字節(jié)的發(fā)送順序是怎樣的?(little-endian還是
big-endian);3)所傳輸?shù)臄?shù)值是有符號的(signed)還是無符號的(unsigned)。具體編碼時采用位操作(移位和屏蔽)就可以了。
具體在Java里,可以采用DataOutputStream類和ByteArrayOutputStream來實現(xiàn)?;謴?fù)時可以采用
DataInputStream類和ByteArrayInputStream類。
其次,字符串和文本,在一組符號與一組整數(shù)之間的映射稱為編碼字符集(coded character
set)。發(fā)送者與接收者必須在符號與整數(shù)的映射方式上達成共識,才能使用文本信息進行通信,最簡單的方法就是定義一個標(biāo)準(zhǔn)字符集。具體編碼時采用
String的getBytes()方法。
最后,位操作。如果設(shè)置一個特定的設(shè)為1,先設(shè)置好掩碼(mask),之后用或操作;要清空特定一位,用與操作。
3.成幀與解析
成幀(framing)技術(shù)解決了接收端如何定位消息的首位位置的問題。
如果接收者試圖從套接字中讀取比消息本身更多的字節(jié),將可能發(fā)生以下兩種情況之一:如果信道中沒有其他消息,接收者將阻塞等待,同時無法處理接收
到的消息;如果發(fā)送者也在等待接收端的響應(yīng)消息,則會形成死鎖(dealock);另一方面,如果信道中還有其他消息,則接收者會將后面消息的一部分甚至
全部讀到第一條消息中去,這將產(chǎn)生一些協(xié)議錯誤。因此,在使用TCP套接字時,成幀就是一個非常重要的考慮因素。
有兩個技術(shù):
1.基于定界符(Delimiter-based):消息的結(jié)束由一個唯一的標(biāo)記(unique
marker)指出,即發(fā)送者在傳輸完數(shù)據(jù)后顯式添加的一個特殊字節(jié)序列。這個特殊標(biāo)記不能在傳輸?shù)臄?shù)據(jù)中出現(xiàn)。幸運的是,填充(stuffing)技術(shù)
能夠?qū)ο⒅谐霈F(xiàn)的定界符進行修改,從而使接收者不將其識別為定界符。在接收者掃描定界符時,還能識別出修改過的數(shù)據(jù),并在輸出消息中對其進行還原,從而
使其與原始消息一致。
2.顯式長度(Explicit length):在變長字段或消息前附加一個固定大小的字段,用來指示該字段或消息中包含了多少字節(jié)。這種方法要確定消息長度的上限,以確定保存這個長度需要的字節(jié)數(shù)。
接口:
Java代碼 import java.io.IOException; import java.io.OutputStream; public interface Framer { void frameMsg(byte [] message,OutputStream out) throws IOException; byte [] nextMsg() throws IOException; }
定界符的方式:
Java代碼 import java.io.ByteArrayOutputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class DelimFramer implements Framer { private InputStream in;//data source; private static final byte DELIMTER=(byte)'\n';//message delimiter public DelimFramer(InputStream in){ this.in=in; } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { //ensure that the message dose not contain the delimiter for(byte b:message){ if(b==DELIMTER) throw new IOException("Message contains delimiter"); } out.write(message); out.write(DELIMTER); out.flush(); } @Override public byte[] nextMsg() throws IOException { ByteArrayOutputStream messageBuffer=new ByteArrayOutputStream(); int nextByte; while((nextByte=in.read())!=DELIMTER){ if(nextByte==-1){//end of stream? if(messageBuffer.size()==0){ return null; }else{ throw new EOFException("Non-empty message without delimiter"); } } messageBuffer.write(nextByte); } return messageBuffer.toByteArray(); } }
顯式長度方法:
Java代碼 import java.io.DataInputStream; import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class LengthFramer implements Framer { public static final int MAXMESSAGELENGTH=65535; public static final int BYTEMASK=0xff; public static final int SHOTMASK=0xffff; public static final int BYTESHIFT=8; private DataInputStream in;// wrapper for data I/O public LengthFramer(InputStream in) throws IOException{ this.in=new DataInputStream(in); } @Override public void frameMsg(byte[] message, OutputStream out) throws IOException { if(message.lengthMAXMESSAGELENGTH){ throw new IOException("message too long"); } //write length prefix out.write((message.lengthBYTEMASK)BYTEMASK); out.write(message.lengthBYTEMASK); //write message out.write(message); out.flush(); } @Override public byte[] nextMsg() throws IOException { int length; try{ length=in.readUnsignedShort(); }catch(EOFException e){ //no (or 1 byte) message; return null; } //0=length=65535; byte [] msg=new byte[length]; in.readFully(msg);//if exception,it's a framing error; return msg; } }
那要看你是何種輸入手段了,屏幕輸入有Scanner之類,文件輸入的有FileReader之類的,具體可以看下java.io里面的類