- 浏览: 11430 次
- 性别:
- 来自: 江苏
文章分类
最新评论
@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实例分析-银行业务调度系统
2011-01-13 08:49 2760@version 2010.01.13 →实 ... -
Java实例分析-交通灯管理系统
2011-01-12 15:50 1673@version 1.0 2011.01.12 @versi ... -
Java 类加载器、动态代理类等(系列下)
2011-01-12 02:10 933@version 1.0 2011.01.12 9 ... -
Java 内省、注解、泛型等(系列中)
2011-01-12 00:34 1180@version 1.0 2011.01.12 ... -
Java 枚举、反射等(系列上)
2011-01-10 13:54 1295@version 1.0 2011.01.10 ... -
Java基础知识点自检、线程等
2011-01-07 01:16 1253@version 1.0 2011.01.06 @versi ...
相关推荐
### Java输入输出流与文件处理 #### 重要概念与基础知识 **输入输出流与文件处理**在编程领域占据着核心地位,特别是在Java中,通过`java.io`包提供了丰富的类和接口来支持输入输出操作。这包括从键盘读取用户输入...
Java IO(输入输出)是Java编程语言中处理数据输入和输出的核心部分,它提供了一系列类和接口用于在程序与外部资源之间传输数据。在Java中,IO操作涉及到文件的读写、流的处理以及网络通信等。以下是关于Java IO中的...
学习Java输入输出,需要理解流的概念,熟悉各类流的使用,并结合实际场景选择合适的流类型。同时,掌握文件操作、对象序列化、NIO等相关知识,能让你在处理数据交换时更加得心应手。在实践中不断尝试和调试,你会...
Java的输入输出(I/O)系统是编程中不可或缺的一部分,主要负责数据的传输,包括从一个源头(如键盘、文件、网络连接)读取数据和向目的地(如显示器、文件、网络连接)写入数据。Java的I/O库在`java.io`包中,提供...
《Java项目:星际争霸游戏——探索Java Swing、AWT、IO与网络通信的应用》 Java作为一门广泛应用的编程语言,其在图形用户界面(GUI)开发方面有着强大的支持。本项目“星际争霸游戏”就是一个很好的例子,它巧妙地...
Java输入输出操作是Java编程中的基础且重要的一部分,它涵盖了数据的读取、写入以及文件和流的管理。在Java中,输入输出主要通过I/O流(Input/Output Stream)来实现,这些流用于在程序和外部资源之间传输数据。Java...
Java IO编程是Java平台中处理输入输出操作的重要组成部分,它提供了丰富的类库,使得开发者能够高效地进行数据的读取、写入、流的管理和转换。在这个集合中,我们主要探讨的是Java IO在文件读写方面的实践应用。 一...
完整版 Java基础入门教程 Java程序语言设计 04 IO流 输入输出流(共31页).ppt 完整版 Java基础入门教程 Java程序语言设计 05 GUI AWT 事件模型(共27页).ppt 完整版 Java基础入门教程 Java程序语言设计 05 GUI GUI...
适用于希望通过示例深入理解Java IO编程特性的软件开发者。 适合人群:具备基本编程经验并对Java有一定的了解的研发人员和程序员,尤其是关注IO流的初学者。 使用场景及目标:适用于开发中有需要处理数据存储、网络...
Java基础教程中的IO流与网络编程是学习Java技术体系中不可或缺的部分,特别是TCP网络编程,它是构建客户端-服务器应用程序的基础。TCP(传输控制协议)是一种面向连接、可靠的、基于字节流的传输层通信协议,广泛...
Java IO 输入输出处理是Java编程中至关重要的一部分,用于在程序和外部资源(如磁盘、网络、内存等)之间传输数据。Java的IO系统由java.io包提供,它包含了一系列的类和接口,用于实现不同类型的输入输出操作。 **...
下面将详细阐述Java输入与输出流的相关知识点。 1. **流的概念**: 流是Java I/O的核心概念,它代表数据的源或目的地。流可以是向文件、内存、网络连接等地方读写数据。Java中的流分为字节流和字符流,字节流处理...
这个压缩包文件"java_io.rar"包含了一些关于Java IO的实例,旨在帮助开发者理解并掌握Java中的输入输出技术。通过分析提供的文件列表,我们可以推测其中可能包含了一个名为"www.pudn.com.txt"的文本文件以及一个名为...
Java输入输出(IO)系统是Java编程语言中用于处理数据传输的核心部分,它允许程序与外部世界进行数据交互。在Java中,IO操作是通过流(Stream)的概念来实现的,流是数据传输的抽象表示,可以是字符或字节序列。本...
其中,IO API是Java中的一种基本编程接口,用于进行文件、网络、流等操作的输入输出。Java中的IO API可以分为两大类:流式IO和缓冲IO。 流式IO是Java中最基本的IO操作方式,通过InputStream和OutputStream来实现...
Java IO编程是Java开发中的重要组成部分,它负责处理输入(Input)和输出(Output)数据。在Java中,IO操作涉及到文件读写、网络通信、数据流管理等多个方面,是程序与外部世界交互的关键技术。本教程将通过视频形式...
在Java编程语言中,输入和输出(Input/Output, I/O)是程序与外部世界交互的基础。本主题将深入探讨两种主要的输入输出方式:基于流的I/O和基于缓冲区的I/O。 1. 基于流的I/O: Java中的I/O操作主要是通过流...
Java中的IO(输入/输出)系统是编程中不可或缺的一部分,特别是在处理数据的读取、写入、传输和存储时。本教程将深入讲解Java IO流的基础知识,包括其概念、分类、常用类以及如何在实际编程中应用。 一、IO流的概念...
Java输入输出流(IO流)是Java编程语言中处理数据传输的核心部分,它允许程序进行数据的读取和写入操作。在Java中,一切皆为流,输入流用于读取数据,而输出流用于写入数据。这些流可以处理各种类型的数据,包括文本...