一:字符流
字符流以字符为单位, 数据流格式的一种,能有效避免字符流引起中文乱码的问题,能处理Unicode字符集中的任何字符。
通常使用的类 FileWriter(字符输出流) FileReader(字符输入流)
利用字符流复制文件的步骤
创建两个对象,一个是输入,一个输出,在构造方法中绑定写入数据的目的地
利用输入的read方法读取,输出的write方法(字符转换为字节的过程)写入
若不关闭流文件,要flush方法才能把内存缓存区的内容刷新到文件中
释放资源(会先刷新,再关闭文件)
//FileWriter字符输出流的使用
File file = new File("D:\\mylove.txt");
FileWriter fw = new FileWriter(file);
//一次性写入一个字符串内容
fw.write("我是通过字符输出流编写的内容");
//关闭资源
fw.close();
//FileReader字符输入流的使用
File file = new File("D:\\mylove.txt");
FileReader fr = new FileReader(file);
int n = fr.read();
System.out.println((char)n);
//一次性读完 每次读取一个字符
int len = 0;
while(-1!=(len = fr.read())) {
System.out.print((char)len);
}
//每次读取一个字符数组
char[] chs = new char[1024];
int len = 0;
while(-1!=(len = fr.read(chs))) {
System.out.print(new String(chs,0,len));
}
注意:
flush方法 :把Buff刷新到写入数据的文件中,流文件还能继续使用。
close方法:先刷新Bufff写入,再通知系统释放资源,关闭流文件。
字符流的缓冲区:
缓冲区的出现提高了对流的操作效率。
原理:其实就是将数组进行封装。
常用的对象:
BufferedWriter:
特别的方法:
newLine():跨平台的换行符。
BufferedReader:
特别的方法:
readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。
使用缓冲区对象时,要明确缓冲的存在是为了增强流的功能而存在,所以在简历缓冲区对象时,要现有流对象存在。
其实缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行了临时存储,为了提高操作数据的效率。
//BufferedWriter
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("D:\\xx.txt")));
bw.write("我爱你");
bw.newLine();//跨行
bw.flush();//刷新缓冲区
bw.close();
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("D:\\zz.txt")));
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("请输入内容: ");
String str = sc.next();
//判断
if("bye".equals(str)) {
break;
}
bw.write(str);
bw.newLine();//跨行
bw.flush();//刷新
}
bw.close();
中间转换流
- InputStreamReader : 是字节流与字符流之间的桥梁,能将字节流输出为字符流,并且能为字节流指定字符集,可输出一个个的字符;
先获取字节流,然后创建InputStreamReader将字节流转化成字符流,并指定其字符集为UTF-8,然后使用强制转化将read到的int字节转化为char型,此时已可以输出中文字符,并且可速度上看出,输出字符流比输出字节流要快。
在读取网络数据流的时候,可以通过先用InputStream获取字节流、InputStreamReader将字节流转化成字符流、BufferedReader将字符流以缓存形式输出的方式来快速获取网络数据流。
File file = new File("D:\\我的老婆.txt");
FileInputStream fis = new FileInputStream(file);
//InputStreamReader ——字符流
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String content = br.readLine();
System.out.println(content);
br.close();
isr.close();
FileReader fr = new FileReader(new File("D:\\我的老婆.txt"));
BufferedReader br = new BufferedReader(fr);
String content = br.readLine();
System.out.println(content);
br.close();
fr.close();
中间转换流
- OutputStreamWriter: 是字符流通向字节流的桥梁:可使用指定的charse将要写入流中的字符编码成字节
使用步骤:
1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
2.使用OutputStreamWriter对象中的方法write,把字符转化为字节存储缓冲区中(编码)
3.使用OutputStreaamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
4.释放资源
//创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day10_IO\\utf_8.txt"),"utf-8");
//2.使用OutputStreamWriter对象中的方法write,把字符转化为字节存储缓冲区中(编码)
osw.write("你好,未来");
//使用OutputStreaamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
osw.flush();
//释放资源
osw.close();
//创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("欧克.txt"),"utf-8");
//使用OutputStreamWriter对象中的方法write,把字符转化为字节存储缓冲区中(编码)
osw.write("你好,未来");
//使用OutputStreaamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
osw.flush();
//释放资源
osw.close();
二:Java网络编程(NET)的基本概述
1.软件体系结构分类:
C/S结构 | 全称Client/Server结构,是指客户端和服务器结构。常见程序有QQ,迅雷等软件。 |
B/S结构 | 全称为Browser/Server结构,是指浏览器和服务器结构。常见浏览器有谷歌、火狐等。 |
两种结构各有优势,但是无论哪种架构,都离不开网络的支持。
网络编程,就是在一定的协议(**规则**)下,实现两台计算机通信的程序。
2.网络通信协议
通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵循一定的规则,
这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等等做了统一规定,通信双方必须同时遵守才能完成数据交换。
协议分类
UDP协议
TCP协议
3.网络编程概述
网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。
4.实现网络编程三要素
IP地址
- 是网络中设备的唯一标识
- dos命令下:ipconfig/all 查看本机IP地址
- ping IP地址:检查网络是否连通
- 127.0.0.1 回送地址,可以代表本机地址,一般用来测试使用
端口
- 设备行应用程序的唯一标识
协议
- InetAddress-----------此类表示Internet协议(IP地址)
- TCP|IP协议
- UDP协议
5.NET包常用类
- 面向IP层的类:InetAddress
- 面向应用层的类:URL、URLConnection
- 面向网络层的类:
- TCP协议相关类:Socket、ServerSocket
- UDP协议相关类:DatagramPacket、DatagramSocket、MulticastSocket
6.InetAddress
Internet 上的主机有两种方式表示地址,分别为域名和 IP 地址。java.net 包中的 InetAddress 类对象包含一个 Internet 主机地址的域名和 IP 地址
常用方法:
String getHostAddress() | 返回 IP 地址字符串(以文本表现形式) |
String getHostName() | 返回此 IP 地址的主机名 |
byte[] getAddress() | 返回此 InetAddress 对象的原始 IP 地址 |
static InetAddress getByName(String host) | 在给定主机名的情况下确定主机的 IP 地址 |
7.URL
URL(Uniform Resource Locator)是一致资源定位器的简称,它表示Internet上某一资源的地址。
通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。
URL组成
http://www.runoob.com/index.html?language=cn#j2se
-
协议(protocol)
协议名(protocol)指明获取资源所使用的传输协议,如http、ftp、gopher、file等,资源名(resourceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。
-
主机名(host:port)
www.runoob.com
-
端口(port)
端口范围:0-65535
http默认端口:80
https默认端口:443
默认端口浏览器会隐藏
0-1024是系统保留的端口
-
路径(path)
/index.html
-
请求参数(query)
language=cn
-
定位位置(fragment)
j2se,定位到网页中 id 属性为 j2se 的 HTML 元素位置 。
总结:
http://www.gamelan.com:80/Gamelan/network.html#BOTTOM 协议名://机器名+端口号+文件名+内部引用.
常用方法:
构造函数:
public URL(String protocol, String host, String file) throws MalformedURLException | 通过给定的参数(协议、主机名、端口号、文件名)创建URL |
public URL(String protocol, String host, String file) throws MalformedURLException | 使用指定的协议、主机名、文件名创建URL,端口使用协议的默认端口 |
public URL(String url) throws MalformedURLException | 通过给定的URL字符串创建URL |
public URL(URL context, String url) throws MalformedURLException | 使用基地址和相对URL创建 |
普通方法:
InputStream openStream() | 打开与此URL的连接,并返回一个InputStream对象,以便读取数据 |
public URLConnection openConnection() throws IOException | 打开一个URL连接,并运行客户端访问资源 |
8.URLConnection
URLConnection是一个抽象类,指向URL指定资源的活动连接。与URL相比,它可以对服务器的交互进行更多的控制。
public InputStream getInputStream() throws IOException | 返回URL的输入流,用于读取资源 |
public OutputStream getOutputStream() throws IOException | 返回URL的输出流, 用于写入资源 |
9.简单网络爬虫
public class TestURL2 {
public static void main(String[] args) {
crawler();
}
/**
* 网络爬虫:
* 从网络上获取资源 www.baidu.com
* 储存到本地
*/
public static void crawler() {
BufferedReader br = null;
BufferedWriter bw = null;
try {
//(1)创建URL对象
URL url = new URL("https://www.baidu.com");
//(2)获取字节输入流
InputStream is = url.openStream();
//(3)缓冲流---将字节流转换为字符流进行包装
br = new BufferedReader(new InputStreamReader(is,
"utf-8"));
//(4)存储到本地
bw = new BufferedWriter(new OutputStreamWriter(new
FileOutputStream("baidu.html"), "utf-8"));
//(5)边读边写
String line = null;
/*
* 这样就可以将网络内容下载到本地机器。
* 然后进行数据分析,建立索引。这也是搜索引擎的第一步。
*/
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
//(6)关闭流
try {
if(bw != null)
bw.close();
if(br != null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}