2019独角兽企业重金招聘Python工程师标准>>>
java io流 传输操作
字节流和字符流的区别:
读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,字符流就是 : 字节流+编码表。
处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
纯文本数据优先考虑字符流 别的 字节流
常用 字节流:
FileInputStream //字符流读文件
FileOutputStream //字符流写文件
BufferedInputStream //带缓冲区的 读文件
BufferedOutputStream //带缓冲区 写文件
字符流:
Writer Reader
FileReader //文件读
FileWriter //文件写
BufferedReader //缓存读操作
BufferedWriter //缓存写操作
创建一个可以往文件中写入字符数据的字符输出流对象,如果文件不存在,则会自动创建。如果文件存在,则会被覆盖。
因为不同系统换行符号不同所以,可以调用系统函数获得换行符号,便于不同系统移植
private static final String LINE_SEPARATOR = System.getProperty("line.separator"); //换行符
FileWriter fw = new FileWriter("demo.txt",true); //创建一个文件
fw.write("abcde"+LINE_SEPARATOR+"hahaha"); //数据写入到临时存储缓冲区中。
fw.flush(); //数据缓冲区刷到文件中
fw.close(); //这个其实会自动调用 flush;上面那样写 可以实时保存
读文件 单个字符模式
FileReader fr = new FileReader("demo.txt"); //打开要读的文件
int ch = 0;
while((ch=fr.read())!=-1){ //文件结束符 为 -1 ,获得单个字符System.out.println((char)ch);
}
fr.close();
单个字符读,操作次数多,浪费资源,于是出现多个字符缓冲区方式读取
FileReader fr = new FileReader("demo.txt");
char[] buf = new char[1024]; //一次读取 1024字节
int len = 0;
while((len=fr.read(buf))!=-1){System.out.println(new String(buf,0,len));
}
fr.close();
一个文件读取写入另一个文件 规范的写法 考虑抛异常
FileReader fr = null;
FileWriter fw = null;
try {fr = new FileReader("a.txt");fw = new FileWriter("b.txt");char[] buf = new char[BUFFER_SIZE];//缓冲区。 int len = 0;while((len=fr.read(buf))!=-1){fw.write(buf, 0, len);}} catch (Exception e) {throw new RuntimeException("读写失败");
}finally{if(fw!=null) //证明打开的文件不为空try {fw.close();} catch (IOException e) {e.printStackTrace();}if(fr!=null)try {fr.close();} catch (IOException e) {e.printStackTrace();}
}
java本身带了缓存对象,可以直接调用 文件打开 操作
FileWriter fw = new FileWriter("buf.txt");
BufferedWriter bufw = new BufferedWriter(fw); //
String line = null;
while((line=bufr.readLine())!=null){ //一次 读一行System.out.println(line);
}FileWriter fw = new FileWriter("buf.txt");
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("abcdef"+x);
bufw.newLine();
bufw.flush();
bufw.close(); //关闭缓冲区 防止内存泄露 这个不需要关闭 文件
字节流例子
FileInputStream fis = new FileInputStream("bytedemo.txt");
byte[] buf = new byte[1024];
int len = 0;while((len=fis.read(buf))!=-1){ //文件没结束System.out.println(new String(buf,0,len));
}FileOutputStream fos = new FileOutputStream("bytedemo.txt");fos.write("abcdefg".getBytes()); //文件中写入数据
//fos.flush();
fos.close();//关闭资源动作要完成。
拷贝一首MP3文件
FileInputStream fis = new FileInputStream("c:\\0.mp3");
BufferedInputStream bufis = new BufferedInputStream(fis); //缓冲区方式FileOutputStream fos = new FileOutputStream("c:\\2.mp3");
BufferedOutputStream bufos = new BufferedOutputStream(fos);int ch = 0;
while((ch=bufis.read())!=-1){bufos.write(ch);
}bufos.close(); //关闭缓存区
bufis.close();
字符/字节流直接的转换 InputStreamReader、OutputStreamWriter
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 字节流到字符流
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt")));
字符流道字节流 转换桥
java网络通信 UDP函数
DatagramSocket ds = new DatagramSocket(10000); //UDP 绑定端口while(true){byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length); //UDP包对象ds.receive(dp);//阻塞式的。//4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。String ip = dp.getAddress().getHostAddress();int port = dp.getPort();String text = new String(dp.getData(),0,dp.getLength()); //数据System.out.println(ip+":"+port+":"+text);
}ds.close();
UDPsend
DatagramSocket ds = new DatagramSocket(); BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;while((line=bufr.readLine())!=null){byte[] buf = line.getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.100"),10000); //udp发送包ds.send(dp); if("886".equals(line))break;
}ds.close();
TCP通信对象 客户端
Socket socket = new Socket("192.168.1.100",10002); //服务器IP 端口OutputStream out = socket.getOutputStream(); //输出的信息
out.write("tcp 输出".getBytes());InputStream in = socket.getInputStream(); //接收到的信息
byte[] buf = new byte[1024];int len = in.read(buf);String text = new String(buf,0,len);System.out.println(text); socket.close();
服务器端
ServerSocket ss = new ServerSocket(10002);Socket s = ss.accept(); //获得客户端对象String ip = s.getInetAddress().getHostAddress(); //获得客户端IPInputStream in = s.getInputStream(); //接收到的客户端数据
byte[] buf = new byte[1024];int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text);OutputStream out = s.getOutputStream(); //发送到客户端数据
out.write("收到".getBytes());s.close();
ss.close();