日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java文件读写

發(fā)布時間:2023/12/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java文件读写 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1、File類

文件和文件夾的基本操作 public class TestFile { public static void main(String[] args) throws IOException {File file = new File("d:/a");//文件對象 //String[] list = file.list();//File[] listFiles = file.listFiles();String[] list = file.list(new FilenameFilter() {public boolean accept(File dir, String name) { return name.contains("a");}}); System.out.println(Arrays.toString(list));//file.createNewFile(); //System.out.println(file.exists());//判斷是否存在//System.out.println(file.canRead());//System.out.println(file.canWrite());//System.out.println(file.delete());//System.out.println(file.getAbsolutePath());//System.out.println(file.getName());//String fileName = file.getName();//System.out.println(fileName.substring(fileName.lastIndexOf(".")+1)); // String parent = file.getParent(); // System.out.println(parent);//long freeSpace = file.getFreeSpace();//System.out.println(freeSpace);//System.out.println(file.length());//System.out.println(file.getPath());//System.out.println(file.isFile());//file.mkdirs();//System.out.println(file.isDirectory());}}

2、流

java中有四大家族的流,他們都是抽象類:

java.io.InputStream 字節(jié)輸入流

java.io.OutputStream 字節(jié)輸出流

java.io.Reader 字符輸入流

java.io.Writer 字符輸出流

對于文件有這些流常用:

java.io.FileInputStream

java.io.FIleOUtStream

java.io.FileReader

java.io.FileWriter

對象有關(guān)的流:

java.io.ObjectInputStream

java.io.ObjectOutputStream

轉(zhuǎn)換流:

OutputStreamWriter

InputStreamReader

2.1 字節(jié)流

文件的讀和寫:

public static void main(String[] args) throws Exception{//創(chuàng)建流---指定文件位置InputStream is = new FileInputStream("d:/a.txt");OutputStream os = new FileOutputStream("d:/b.txt",true);//已經(jīng)創(chuàng)建了b.txt//調(diào)用流的方法去讀和寫 //一個字節(jié)一個字節(jié)讀 // int data; // while((data= is.read())!=-1) { // System.out.println((char)data); // }//一次讀多個字節(jié)byte[] data = new byte[4];//緩存數(shù)組--8*1024int length;while((length = is.read(data))!=-1) {//輸出到控制臺System.out.println(new String(data,0,length));os.write(data, 0, length);}os.write(10);//換行//關(guān)閉資源is.close();os.close();System.out.println("over");}//找一張圖片或者音樂,用字節(jié)流操作來復(fù)制一下這個圖片或音樂 public class TestCopyPic {public static void main(String[] args) {InputStream is= null;OutputStream os = null;try {is = new FileInputStream("d:/th.jpg"); os = new FileOutputStream("d:/a/th.jpg",true);byte[] buf = new byte[8*1024];int length=-1;while((length=is.read(buf))!=-1) {os.write(buf, 0, length);}} catch (FileNotFoundException e) { e.printStackTrace();} catch (IOException e) {e.printStackTrace();}finally {//先開的后關(guān)try {os.close();is.close();} catch (IOException e) { e.printStackTrace();} } }}

2.2、字符流

FileWriter和FileReader中的操作方式和FileInputStream以及FileOutStream相似

2.3、緩沖流

FileReader fileReader = new FileReader("G:/b/b.text"); BufferedReader bufferedReader = new BufferedReader(fileReader); String s2 = null; while((s2 = bufferedReader.readLine()) != null){System.out.println(s2); } bufferedReader.close();FileWriter fileWriter = new FileWriter("G:/b/b.text"); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.newLine(); bufferedWriter.write(123); bufferedWriter.flush(); bufferedWriter.close();

2.4、序列化流(對象流)

//反序列化流--將序列化過程中所生產(chǎn)的二級制串轉(zhuǎn)化成數(shù)據(jù)結(jié)構(gòu)或?qū)ο?public class ObjectInputStreamextends InputStream implements ObjectInput, ObjectStreamConstants{} //序列化流--將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換成二進(jìn)制串 public class ObjectOutputStreamextends OutputStream implements ObjectOutput, ObjectStreamConstants{} //Serializable接口,當(dāng)一個類的實(shí)例要被對象流讀寫時,要求必須實(shí)現(xiàn)serializable接口

3、socket

服務(wù)端:

ServerSocket server = new ServerSocket(6666);//啟動監(jiān)聽 Socket socket = server.accept(); //一直沒有接收到客戶端信號就一直阻塞 System.out.println(socket.getInetAddress().getHostAddress()+"連接了服務(wù)器");

客戶端:

Socket socket = new Socket("10.7.163.102", 6666);

交互客戶端:

package com.qf.cdjava2201.day24.chat;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class Server {//接收消息,并且轉(zhuǎn)發(fā)消息給所有的客戶端--集合,也可以使用線程池List<ThreadSocket> clients = new ArrayList<Server.ThreadSocket>();public void start() {try {ServerSocket server = new ServerSocket(8888); while(true) {Socket socket = server.accept(); //接收客戶端連接System.out.println(socket.getInetAddress().getHostAddress()+"連接了服務(wù)器");//保存這個客戶端ThreadSocket client = new ThreadSocket(socket);clients.add(client); new Thread(client).start();}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {new Server().start();}public class ThreadSocket implements Runnable{Socket socket;String name;public ThreadSocket(Socket socket) {this.socket = socket;}//處理每個客戶端的聊天信息public void run() {//接收一個名字try {//從socket中獲取輸入流并建立緩沖區(qū)進(jìn)行讀取BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));name = br.readLine();//把名字廣播給所有的客戶端String msg = "歡迎"+name+"進(jìn)入聊天室"; sendMsg(msg);while(true) {//接收消息并轉(zhuǎn)發(fā)BufferedReader br1 = new BufferedReader(new InputStreamReader(socket.getInputStream()));String info = br1.readLine();sendMsg(name+"["+socket.getInetAddress().getHostAddress()+"]:"+info);System.out.println(name+"["+socket.getInetAddress().getHostAddress()+"]:"+info);if(info.equals("88")) {System.out.println(name+"退出了聊天室");socket.close();clients.remove(this);break;}} } catch (IOException e) { e.printStackTrace();}}//廣播所有信息的方法private void sendMsg(String msg) {for (ThreadSocket client : clients) {try {BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(client.socket.getOutputStream()));bw.write(msg);bw.newLine();bw.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}} }客戶端package com.qf.cdjava2201.day24.chat;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner;public class Client {static boolean flag = true;public static void main(String[] args) {Scanner input = new Scanner(System.in); //建立連接try {Socket socket = new Socket("127.0.0.1",8888);//接收消息--啟動一個線程來一直接收消息,客戶端不關(guān)閉,便一直接收new Thread(new Runnable() {public void run() {while(flag) {BufferedReader br=null;try {br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String info="";info = br.readLine();System.out.println(info);} catch (IOException e1) {//輸入88這里有個異常} }}}).start();//輸入昵稱發(fā)給服務(wù)器 System.out.println("請輸入您的昵稱:");String name = input.next();BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw.write(name);bw.newLine();bw.flush(); //發(fā)送消息while(true) {System.out.println("請發(fā)送消息:");String msg = input.next();BufferedWriter bw1 = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));bw1.write(msg);bw1.newLine();bw1.flush(); if(msg.equals("88")) {//最后關(guān)閉流的方式還可以用socket.shutdownOutput()。相比于socket.close(),這個方法是在服務(wù)端收到消息后,還能再發(fā)消息給客戶端,然后再關(guān)閉Socket。socket.close();flag = false;break;}}} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} //這里設(shè)計的通知服務(wù)端已發(fā)送完命令的方式是設(shè)定“88”,但在真實(shí)的使用中,肯定是麻煩的,比如不能單獨(dú)輸入88了。 //這里推薦使用“指定長度”的方法。 轉(zhuǎn)載于---博客園,作者:已往之不諫。如果你了解一點(diǎn)class文件的結(jié)構(gòu)(后續(xù)會寫,敬請期待),那么你就會佩服這么設(shè)計方式,也就是說我們可以在此找靈感,就是我們可以先指定后續(xù)命令的長度,然后讀取指定長度的內(nèi)容做為客戶端發(fā)送的消息。現(xiàn)在首要的問題就是用幾個字節(jié)指定長度呢,我們可以算一算:1個字節(jié):最大256,表示256B 2個字節(jié):最大65536,表示64K 3個字節(jié):最大16777216,表示16M 4個字節(jié):最大4294967296,表示4G 依次類推這個時候是不是很糾結(jié),最大的當(dāng)然是最保險的,但是真的有必要選擇最大的嗎,其實(shí)如果你稍微了解一點(diǎn)UTF-8的編碼方式(字符編碼后續(xù)會寫,敬請期待),那么你就應(yīng)該能想到為什么一定要固定表示長度字節(jié)的長度呢,我們可以使用變長方式來表示長度的表示,比如:第一個字節(jié)首位為0:即0XXXXXXX,表示長度就一個字節(jié),最大128,表示128B 第一個字節(jié)首位為110,那么附帶后面一個字節(jié)表示長度:即110XXXXX 10XXXXXX,最大2048,表示2K 第一個字節(jié)首位為1110,那么附帶后面二個字節(jié)表示長度:即110XXXXX 10XXXXXX 10XXXXXX,最大131072,表示128K 依次類推上面提到的這種用法適合高富帥的程序員使用,一般呢,如果用作命名發(fā)送,兩個字節(jié)就夠了,如果還不放心4個字節(jié)基本就能滿足你的所有要求,下面的例子我們將采用2個字節(jié)表示長度,目的只是給你一種思路,讓你知道有這種方式來獲取消息的結(jié)尾:服務(wù)端程序:public class SocketServer {public static void main(String[] args) throws Exception {// 監(jiān)聽指定的端口int port = 55533;ServerSocket server = new ServerSocket(port);// server將一直等待連接的到來System.out.println("server將一直等待連接的到來");Socket socket = server.accept();// 建立好連接后,從socket中獲取輸入流,并建立緩沖區(qū)進(jìn)行讀取InputStream inputStream = socket.getInputStream();byte[] bytes;// 因?yàn)榭梢詮?fù)用Socket且能判斷長度,所以可以一個Socket用到底while (true) {// 首先讀取兩個字節(jié)表示的長度int first = inputStream.read();//如果讀取的值為-1 說明到了流的末尾,Socket已經(jīng)被關(guān)閉了,此時將不能再去讀取if(first==-1){break;}int second = inputStream.read();int length = (first << 8) + second;// 然后構(gòu)造一個指定長的byte數(shù)組bytes = new byte[length];// 然后讀取指定長度的消息即可inputStream.read(bytes);System.out.println("get message from client: " + new String(bytes, "UTF-8"));}inputStream.close();socket.close();server.close();} } 此處的讀取步驟為,先讀取兩個字節(jié)的長度,然后讀取消息,客戶端為:public class SocketClient {public static void main(String args[]) throws Exception {// 要連接的服務(wù)端IP地址和端口String host = "127.0.0.1";int port = 55533;// 與服務(wù)端建立連接Socket socket = new Socket(host, port);// 建立連接后獲得輸出流OutputStream outputStream = socket.getOutputStream();String message = "你好 yiwangzhibujian";//首先需要計算得知消息的長度byte[] sendBytes = message.getBytes("UTF-8");//然后將消息的長度優(yōu)先發(fā)送出去outputStream.write(sendBytes.length >>8);outputStream.write(sendBytes.length);//然后將消息再次發(fā)送出去outputStream.write(sendBytes);outputStream.flush();//==========此處重復(fù)發(fā)送一次,實(shí)際項(xiàng)目中為多個命名,此處只為展示用法message = "第二條消息";sendBytes = message.getBytes("UTF-8");outputStream.write(sendBytes.length >>8);outputStream.write(sendBytes.length);outputStream.write(sendBytes);outputStream.flush();//==========此處重復(fù)發(fā)送一次,實(shí)際項(xiàng)目中為多個命名,此處只為展示用法message = "the third message!";sendBytes = message.getBytes("UTF-8");outputStream.write(sendBytes.length >>8);outputStream.write(sendBytes.length);outputStream.write(sendBytes); outputStream.close();socket.close();} }

總結(jié)

以上是生活随笔為你收集整理的java文件读写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。