`

Java 输入输出(IO)与网络编程

阅读更多

@version 1.0 2011.01.08


IO/输入输出

 

→File类

唯一代表磁盘文件本身信息的类(不是文件中的内容

文件操作方法

→RandomAccessFile类

提供了众多的文件访问方法

支持“随机访问”方式(如实现断点下载、多线程下载)

读写等长记录格式文件

只读/读写两种构造方法

→eg

→节点流

→流  字节序列的抽象概念(数据传输时的形态)

→节点流类/过滤流类(处理流类)

 

→InputStream类

→OutputStream类

 void flush()  IO缓冲区 

 

→FileInputStream与FileOutputStream类

→Reader与Writer类  是所有字符流类的抽象基类 用于读写文本数据

 二进制文件、文本文件(专用于存储文本字符,没有包含文本之外的数据) 

 →FileWriter/FileReader类

 

→PipedInputStream与PipedOutPutStream类  用于应用程序中的创建管道通信

 eg.线程通信

 import java.io.*;

 public class Sender extends Thread{

private PipedOutputStream out = new PipedOutputStream();

private PipedOutputStream getOutputStream(){

return out;

}

public void run(){

String strInfo = new String("Hello,Sender");

try{

out.write(strInfo.getBytes());

out.close();

}catch(Exception ex){}

}

 }

 

 import java.io.*;

 public class Receiver extends Thread{

private PipedInputStream in = new PipedInputStream();

private PipedInputStream getInputStream(){

return in;

}

public void run(){

byte[] buf = new byte[1024];

try{

int len = in.read(buf);

System.out.println(

                                          "the following message comes from sender :"

                                           +new String(buf,0,len));

in.close();

}catch(Exception ex){}

}

 }

 

 public class PipedStreamTest{

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

Sender t1 = new Sender();

Receiver t2 = new Receiver();

PipedOutputStream out = t1.getOutputStream();

PipedInputStream in = t2.getInputStream();

out.connect(in); //in.connect(out);

t1.start();

t2.start();

}

 }

 

→PipedWriter和PipedReader类

使用管道流类,可以实现各个程序模块之间的松耦合通信

数据压缩、加密等

 

→ByteArrayInputStream与ByteArrayOutputStream类

用于以IO流的方式完成对字节数组内容的读写,来支持类似内存虚拟文件或者内存印象文件的功能

         ByteArrayInputStream(byte[] buf)

ByteArrayInputStream(byte[] buf,int offset,int.length)

ByteArrayOutputStream()

ByteArrayOutputStream(int)

可用于内存创建临时数据,而不用访问硬盘操作,极大提高效率

→重视IO接口程序的复用性

→字符编码(★)

→计算机软件一切都是用数字来表示的  ASCII码(0-127)

 中文字符的每个字节的最高位bit都是1,GB2312、GBK(包括繁体)

 台湾地区中文字符集 BIG5(大五码)

 Unicode编码  

   全世界所有符号统一编码(两个字节/2^16=65536个)

其中0xD800-0xDFFF区间为代理区,UTF-16即是据此扩充

→转码

 UTB-8编码 (通常都要EF BB BF作为文件开头的三个字节数据进行标记)

\u0001和\u0007f之间的字符,占用两个字节,UTF-8编码为:

(byte)c

0001-007E 0xxxxxxx (7bis)

\u0000或范围在\u0080和\u07ff之间的字符,占用两个字节,

                 UTF-8编码为:

(byte)(0xc0|(0x1f&(c>>6))),(byte)(0x80|(0x3f&c))

0000和0080-07FF  110xxxxx 10xxxxxx (11bits)

\u0800和\uffff之间的字符,占用三个字节,UTF-8编码为:

(byte)(0xe0|(0x0f&(c>>12))),

                        (byte)(0x80|(0x3f&(c>>6))),

                        (byte)(0x80|(0x3f&c))

0800-FFFF 1110xxxx 10xxxxxx 10xxxxxx (16bits)

优点:

不出现内容为0x00字节

便于应用程序检测数据在传输过程中是否发生了错误

直接处理使用ASCII码的英文

缺点:

某些字符需要3字节编码

→字符编码编程应用

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

 

System.setProperty("file.encoding","iso8859-1");

System.getProperties().list(System.out);

 

String strChina = "中国";

//Unicode

for(int i=0;i<strChina.length();i++){

System.out.println(Integer.toHexString((int)strChina.charAt(i)));

}

//GB2312

byte[] buf = strChina.getBytes("gb2312");

for(int i=0;i<buf.length;i++){

System.out.println(Integer.toHexString(buf[i]));

}

 

for(int i=0;i<buf.length;i++){

System.out.write(buf[i]);

}

System.out.println(); //刷新缓冲区,显示内容

//System.out.write(buf,0,4);

}

...

→过滤流和包装类

包装类的概念与作用

→BufferedInputStream与BufferedOutputStream类

缓冲流为IO流增加了内存缓冲区,增加了缓冲区有两个基本目的

 →允许java程序一次不只操作一个字节吗,这样提高了程序的性能。

 →由于有了缓冲区,使得在留上执行skip、mark和reset方法都成为可能。

BufferedInputStream和BufferedOutputStream是Java提供的两个缓冲区包装类,

不管底层系统是否使用了缓冲区,这两个类在自己的实例对象中创建缓冲区。

 BufferedInputStream(InputStream in)

 BufferedInputStream(InputStream in,int size)

 BufferedOutputStream(OutputStream out)

 BufferedOutputStream(OutputStream out,int size)

→BufferedReader和BufferedWriter类

→DataInputStream与DataOutputStream类

writeBytes(String s)\writeChars(String s)\writeUTF(String s)

readUTF()  【ps:02_12 2808】

→eg

import java.io.*;

public class DataStreamTest{

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

FileOutputStream fos = new FileOutputStream("count.txt");

BufferedOutputStream bos =

                                                       new BufferedOutputStream(fos);

DataOutputStream dos = new DataOutputStream(bos);

dos.writeUTF("ab中国");

dos.writeBytes("ab中国");

dos.writeChars("ab中国");

dos.close();

FileInputStream fis = new FileInputStream("count.txt");

BufferedInputStream bis = new BufferedInputStream(fis);

DataInputStream dis = new DataInputStream(bis);

System.out.println(dis.readUTF());

byte[] buf = new byte[1024];

int len = dis.read(buf);

System.out.println(new String(buf,0,len));

}

}

→PrintStream类 print()/println() 可以将基本数据类型的数据格式化成字符串输出

→ObjectOutputStream与ObjectInputStream类

所读取对象必须实现了Serializable接口。对象中transient和static类型的成员变量不会被读取和写入

→eg 对象传输【02_13】

→字节流与字符流的转换

InputStreamReader、OutputStreamWriter尽量使用 BufferedInputStream、BufferedOutputStream包装使用

→Java程序与其他进程的数据通信

→字符输入/输出流类关系

→Decoratot设计模式(包装)【02_15 3311】

→F&Q【02_15 8345】

 

 

网络编程

1,网络协议与TCP/IP

→IP+Port、127.0.0.1/localhost、IPv6

→UDP与TCP

TCP,传输控制协议,是面向连接的通信协议、提供更可靠无差错(应答)数据通信。

UDP,用户数据报协议,是无连接通信协议、不保证可靠(无应答)。

→协议类型+源IP+目标IP+源端口+目标端口+帧序号+帧数据

→Socket 数据发送过程

→java.net包

DatagramSocket类用于UDP通信

ServerSocket类用于TCP通信的服务端

Socket类用于TCP通信的服务器和客户端

2,UDP网络程序

→DatagramSocket类

public DatagramSocket()

public DatagramSocket(int port)

public DatagramSocket(int port,InetAddress Iaddr)

close()、send(DatagramPacket p)、receive(DatagramPacket p)

→DatagramPacket类

public DatagramPacket(byte[] buf,int length) //receive

public DatagramPacket(byte[] buf,int length,

                                         InetAddress address,int port)//send

getInetAddress、getPort、getData、getLength

→InetAddress类——表示计算机IP地址

getByName()

getHostAddress()

→eg

import java.net.*;

public class UpdSend{

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

DatagramSocket ds = new DatagramSocket();

String strInfo = "hello,world";

//发送

DatagramPacket dp =

                              new DatagramPacket(strInfo.getBytes(),strInfo.length(),

InetAddress.getByName("192.168.2.121"),3000);

ds.send(dp);

ds.close();

}

}

import java.net.*;

public class UpdRecv{

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

DatagramSocket ds = new DatagramSocket(3000);

byte[] buf = new byte[1024];

DatagramPacket dp = new DatagramPacket(buf,1024);

String strInfo = "hello,world";

//接收

ds.receive(dp);

System.out.println(

                                new String(dp.getData(),0,dp.getLength())

+ "from" +dp.getAddress().getHostAddress()

                                + ":" + dp.getPort()); //192.168.2.121

ds.close();

}

}

→UDP网络聊天程序

 编写图形用户界面、编写网络消息发送功能、编写网络消息接收功能

→私有IP通过网关代理上网的原理【04_04】

 

3,TCP网络程序

→TCP网络程序的工作原理

→ServerSocket类

 public ServerSocket()

 public ServerSocket(int port)

 public ServerSocket(int port,int backlog)

 public ServerSocket(int port,int backlog,InetAddress bindAddr)

 close()、accept()

→Socket类

 public Socket()

 public Socket(String host,int port) //

 public Socket(InetAddress address,int port) //

 public Socket(String host,int port,InetAddress address,int port)

 public Socket(InetAddress host,int port,InetAddress address,int port)

 getInputStream/getOutputStream

→TCP服务器必须先启动运行,TCP客户程序才能连接上TCP服务器

→eg

import java.net.*;

import java.io.*;

public class TcpServer{ //服务器端Socket

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

ServerSocket ss = new ServerSocket(8001);

Socket s = ss.accept(); //对象与服务器Socket建立专线连接(一次只连接一个)

//若未被请求,以下则阻塞

InputStream ips = s.getInputStream();

OutputStream ops = s.getOutputStream();

ops.write("welcome to java".getBytes());

byte[] buf = new byte[1024];

int len = ips.read(buf);

System.out.println(new String(buf,0,len));

//调用完成即关闭

ips.close();

ops.close();

s.close();

ss.close();

}

}

//telnet 可以作为客户端Socket 进行测试

→完善的TCP服务器程序结构模型【04_06】

import java.net.*;

import java.io.*;

public class ReverseServer{ //一对多

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

ServerSocket ss = null;

if(args.length<1){

ss = new ServerSocket(8001);

}else{

ss = new ServerSocket(Integer.parseInt(args[0]));

}

boolean bRunning = true;

while(bRunning){

Socket s = ss.accept();

new Thread(new Servicer(s)).start();

}

ss.close();

}

}

    

import java.net.*;

import java.io.*;

public class Servicer implements Runnable{

private Socket s = null;

public Servicer(Socket s){

this.s = s;

}

public void run(){

InputStream ips = null;

try {

ips = s.getInputStream();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

OutputStream ops = null;

try {

ops = s.getOutputStream();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

BufferedReader br = new BufferedReader(

                                                            new InputStreamReader(ips));

                        //设置自动刷新缓冲区

PrintWriter pw = new PrintWriter(ops,true);


while(true){

String strLine = null;

try {

strLine = br.readLine();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if(strLine.equalsIgnoreCase("quit")){

break;

}

System.out.println(strLine + strLine.length());

String strEcho =

                                 (new StringBuffer(strLine).reverse()).toString();

pw.println(strLine+"→→→"+strEcho);

//pw.print(strLine+"→→→"+strEcho+"\r\n");

//pw.print(strLine+"→→→"+strEcho+System.getProperty(line.separator));

//注意:使用print方法将"接收不到服务器端的相应信息",

//因为PrintWrite类的print方法即使遇到“\n”、

                                //设置刷新标志也不会刷新,必须调用println。

}

}

}

 

→检测和解决端口冲突问题

netstat -na

配置参数指定TCP服务器程序所使用的端口号/保存配置到文件以便下次运行自动读取端口号

→TCP网络连接上传递对象 ObjectInputStream/ObjectOutputStream 【04_07】

→应用程序协议、网络通信协议的关系

→java.net包中URL、URLDecoder、URLEncoder、URLConnection、HttpURLConnection类

Uniform Resource Locator、HTTP 1.1 

→URL

public URL(String spec)

public URL(String protocol,String host,int port,String file)

public URL(String protocol,String host,int port,String file,URLStreamHandler handler)

public URL(URL context,String spec)

getProtocol、getHost、getPort、getFile、openConnection

→工厂模式

→URLConnection、HttpURLConnection类

setRequestProperty\getHeaderFields\getInputStream\getOutputStream\

getHeaderField\getContentLength\getContentEncoding\getContentType

→eg

import java.net.*;

import java.io.*;

import java.util.*;

public class GetGoogle{

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

System.out.println("获取日文页面");

getContentByLanguage("ja");

System.out.println("\n");

System.out.println("获取中文页面");

                         //实际运行时zh-cn超时-Google已结束中文(zh-cn)服务

getContentByLanguage("zh-cn");

}

public static void getContentByLanguage(String country)

                                                                            throws Exception{

URL urlGoogle = new URL("http://www.google.com");

HttpURLConnection googleConnection =                                                                                                          (HttpURLConnection)urlGoogle.openConnection();

googleConnection.setRequestProperty(

                                           "Accept-Language",country);

Map requests = googleConnection.getRequestProperties();

Set reqFields = requests.keySet();

Iterator itrReq = reqFields.iterator();

while(itrReq.hasNext()){

String field = (String)itrReq.next();

System.out.println(field + ":"

                                    + googleConnection.getRequestProperty(field));

}

googleConnection.connect();

Map responses = googleConnection.getHeaderFields();

Set resFields = responses.keySet();

Iterator itrRes = resFields.iterator();

while(itrRes.hasNext()){

String field = (String)itrRes.next();

System.out.println(field + ":"  

                                  + googleConnection.getHeaderField(field));

}

InputStream is = googleConnection.getInputStream();

BufferedReader br = new BufferedReader(

                                                            new InputStreamReader(is));

String strLine = null;

while((strLine = br.readLine()) != null){

System.out.println(strLine);

}

br.close();//将自动关闭is

googleConnection.disconnect();

}

}

→F&Q【04_10 10000】

   

 

 

 

 

分享到:
评论

相关推荐

    java输入输出流与文件处理

    ### Java输入输出流与文件处理 #### 重要概念与基础知识 **输入输出流与文件处理**在编程领域占据着核心地位,特别是在Java中,通过`java.io`包提供了丰富的类和接口来支持输入输出操作。这包括从键盘读取用户输入...

    Java_IO(输入输出)

    Java IO(输入输出)是Java编程语言中处理数据输入和输出的核心部分,它提供了一系列类和接口用于在程序与外部资源之间传输数据。在Java中,IO操作涉及到文件的读写、流的处理以及网络通信等。以下是关于Java IO中的...

    java输入输出代码

    学习Java输入输出,需要理解流的概念,熟悉各类流的使用,并结合实际场景选择合适的流类型。同时,掌握文件操作、对象序列化、NIO等相关知识,能让你在处理数据交换时更加得心应手。在实践中不断尝试和调试,你会...

    java io java 输入输出

    Java的输入输出(I/O)系统是编程中不可或缺的一部分,主要负责数据的传输,包括从一个源头(如键盘、文件、网络连接)读取数据和向目的地(如显示器、文件、网络连接)写入数据。Java的I/O库在`java.io`包中,提供...

    Java项目:星际争霸游戏(java+swing+awt界面编程+IO输入输出流+socket+udp网络通信)

    《Java项目:星际争霸游戏——探索Java Swing、AWT、IO与网络通信的应用》 Java作为一门广泛应用的编程语言,其在图形用户界面(GUI)开发方面有着强大的支持。本项目“星际争霸游戏”就是一个很好的例子,它巧妙地...

    java输入输出操作

    Java输入输出操作是Java编程中的基础且重要的一部分,它涵盖了数据的读取、写入以及文件和流的管理。在Java中,输入输出主要通过I/O流(Input/Output Stream)来实现,这些流用于在程序和外部资源之间传输数据。Java...

    Java IO 编程集合

    Java IO编程是Java平台中处理输入输出操作的重要组成部分,它提供了丰富的类库,使得开发者能够高效地进行数据的读取、写入、流的管理和转换。在这个集合中,我们主要探讨的是Java IO在文件读写方面的实践应用。 一...

    完整版 Java基础入门教程 Java程序语言设计 04 IO流 输入输出流(共31页).ppt

    完整版 Java基础入门教程 Java程序语言设计 04 IO流 输入输出流(共31页).ppt 完整版 Java基础入门教程 Java程序语言设计 05 GUI AWT 事件模型(共27页).ppt 完整版 Java基础入门教程 Java程序语言设计 05 GUI GUI...

    Java输入输出流(IO)教程

    适用于希望通过示例深入理解Java IO编程特性的软件开发者。 适合人群:具备基本编程经验并对Java有一定的了解的研发人员和程序员,尤其是关注IO流的初学者。 使用场景及目标:适用于开发中有需要处理数据存储、网络...

    626.624.JAVA基础教程_IO流与网络编程-TCP网络编程例题3(626).rar

    Java基础教程中的IO流与网络编程是学习Java技术体系中不可或缺的部分,特别是TCP网络编程,它是构建客户端-服务器应用程序的基础。TCP(传输控制协议)是一种面向连接、可靠的、基于字节流的传输层通信协议,广泛...

    JAVA IO 输入输出处理.ppt

    Java IO 输入输出处理是Java编程中至关重要的一部分,用于在程序和外部资源(如磁盘、网络、内存等)之间传输数据。Java的IO系统由java.io包提供,它包含了一系列的类和接口,用于实现不同类型的输入输出操作。 **...

    Java 输入与输出流操作

    下面将详细阐述Java输入与输出流的相关知识点。 1. **流的概念**: 流是Java I/O的核心概念,它代表数据的源或目的地。流可以是向文件、内存、网络连接等地方读写数据。Java中的流分为字节流和字符流,字节流处理...

    java_io.rar_java 输入 输出 实例

    这个压缩包文件"java_io.rar"包含了一些关于Java IO的实例,旨在帮助开发者理解并掌握Java中的输入输出技术。通过分析提供的文件列表,我们可以推测其中可能包含了一个名为"www.pudn.com.txt"的文本文件以及一个名为...

    Java输入输出(IO)和流的基本概念-Java教程共2页

    Java输入输出(IO)系统是Java编程语言中用于处理数据传输的核心部分,它允许程序与外部世界进行数据交互。在Java中,IO操作是通过流(Stream)的概念来实现的,流是数据传输的抽象表示,可以是字符或字节序列。本...

    Java编程中多种IO API复制文件的性能分析.pdf

    其中,IO API是Java中的一种基本编程接口,用于进行文件、网络、流等操作的输入输出。Java中的IO API可以分为两大类:流式IO和缓冲IO。 流式IO是Java中最基本的IO操作方式,通过InputStream和OutputStream来实现...

    Java-Java IO编程教程

    Java IO编程是Java开发中的重要组成部分,它负责处理输入(Input)和输出(Output)数据。在Java中,IO操作涉及到文件读写、网络通信、数据流管理等多个方面,是程序与外部世界交互的关键技术。本教程将通过视频形式...

    Java两种输入输出方式

    在Java编程语言中,输入和输出(Input/Output, I/O)是程序与外部世界交互的基础。本主题将深入探讨两种主要的输入输出方式:基于流的I/O和基于缓冲区的I/O。 1. 基于流的I/O: Java中的I/O操作主要是通过流...

    java中的IO的基础教学(1)

    Java中的IO(输入/输出)系统是编程中不可或缺的一部分,特别是在处理数据的读取、写入、传输和存储时。本教程将深入讲解Java IO流的基础知识,包括其概念、分类、常用类以及如何在实际编程中应用。 一、IO流的概念...

    JAVa输入输出流程序

    Java输入输出流(IO流)是Java编程语言中处理数据传输的核心部分,它允许程序进行数据的读取和写入操作。在Java中,一切皆为流,输入流用于读取数据,而输出流用于写入数据。这些流可以处理各种类型的数据,包括文本...

Global site tag (gtag.js) - Google Analytics