IO流(字符流)

article/2025/9/17 18:07:03

IO流(字符流)

字符流

一.字符流是什么

  • 字符流是可以直接读取字符的IO流
  • 字符流读取字符,就要先读去到字节数据,然后转为字符,如果要写出字符,需要把字符转为字节再写出

FileReader

  • FileReader类的read()方法可以按照字符大小读取

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;public class Demo1_FileReader {public static void main(String[] args) throws IOException {demo1();FileReader fr = new FileReader("xxx.txt");int x;while((x = fr.read()) != -1) {   //通过项目默认的码表,一次读取一个字符System.out.print((char)x);}fr.close();}public static void demo1() throws FileNotFoundException, IOException {FileReader fr = new FileReader("xxx.txt");//需要创建xxx.txt,如果没有就报错int x = fr.read();         //read方法返回jdk码值System.out.println(x);    char c = (char)x;          //要想得到字符,要将码值向下强转成对应的字符System.out.println(c);fr.close();}}

FileWriter

  • FileWrirer类的write()方法可以自动把字符转为字节写出

import java.io.FileWriter;
import java.io.IOException;public class Demo2_FileWriter {public static void main(String[] args) throws IOException {FileWriter fw = new FileWriter("yyy.txt"); //如果有文件直接写,没有文件就创建一个再写fw.write("zt是傻x");fw.write(122);fw.close();}}

拷贝文件


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class Demo3_Copy {public static void main(String[] args) throws IOException {FileReader fr = new FileReader("xxx.txt");FileWriter fw = new FileWriter("yyy.txt");int x;while((x = fr.read()) != -1) {fw.write(x);}fr.close();fw.close();//Write类中有一个2k的小缓冲区,如果不关流,会将文件内容留到缓冲区中,关流会将缓冲区的内容刷新,再关闭}}

一.什么情况下使用字符流

  • 字符流也可以拷贝文件,但不推荐使用,因为读取是会酱紫结转为自负,写出时还要将字符转为字节,很麻烦

那什么时候用呢?

  • 程序需要只读取一段文本时用字符流,因为读取的时候是按大小读取的,不会出现半个中文
  • 程序需要只写出一段文本时用字符流,因为写出的时候可以直接按字符串写出,不用转换为字符数组

二.字符流是否可以拷贝非纯文本文件

  • 不可以,因为在读的时候会将字节转换为字符,在转的过程中,可能找不到对应的字符,就用?代替,
    写出的时候会将字符转为字节写出去,如果是?,直接写出,这样写出的文件就乱了.

三.自定义字符数组的拷贝


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class Demo3_Copy {public static void main(String[] args) throws IOException {//自定义字符数组的拷贝FileReader fr = new FileReader("xxx.txt");FileWriter fw = new FileWriter("yyy.txt");char[] arr = new char[1024];int len;while((len = fr.read()) != -1) {       //将文件的数据读取到字符数组中fw.write(arr,0,len);               //将字符数组中的数据写到文件中}fr.close();fw.close();}
}

带缓冲区的字符流

一.带缓冲区的流中的常规方法

  • BufferedReader的read()方法读取字符时会一次读取若干字符到缓冲区,然后逐个返回给程序,降低读取文件的次数,提高效率
  • BufferedWriter的Writer()方法写出字符时会先写到缓冲区,缓冲区写满后才会写到文件,降低写文件的次数,提高效率

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class Demo3_Copy {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));int c;while((c = br.read()) != -1) {bw.write(c);}br.close();bw.close();}
}

二.带缓冲区的流中的特殊方法

  • BufferedReader的readLine()方法可以读取一行字符(不包括换行符号)
  • BufferedWriter的newLine()可以输出一个跨平台的换行符号
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class Demo4_Buffered {public static void main(String[] args) throws IOException {//demo1();BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));BufferedWriter bw = new BufferedWriter(new FileWriter("yyy.txt"));String line;while((line = br.readLine()) != null) {bw.write(line);//bw.newLine();             //写出回车换行符bw.write("\r\n");}br.close();bw.close();}public static void demo1() throws FileNotFoundException, IOException {BufferedReader br = new BufferedReader(new FileReader("xxx.txt"));String line;//readLine返回一行字符串,用String接收while((line = br.readLine()) != null) {System.out.println(line);}br.close();}}

newLine()与\r\n的区别

  • newLine()是跨平台的方法
  • \r\n只支持Windows系统

LineNumberReader

  • LineNumberReader是BufferedReader的子类,具有相同的功能,并且可以统计行号
  • 调用getLineNumber()方法可以获取当前行号
  • 调用setLineNumber()方法可以设置当前行号
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;public class Demo5_LineNumberReader {public static void main(String[] args) throws IOException {LineNumberReader lnr = new LineNumberReader(new FileReader("zzz.txt"));String line;lnr.setLineNumber(100); //设置开始编号while((line = lnr.readLine()) != null) {System.out.println(lnr.getLineNumber() + ":" + line);//101:a 102:b 103:c 104:d 105:e}lnr.close();}}

装饰设计模式

一. 装饰设计模式的好处是

  • 耦合性不强,被装饰类的变化与装饰类的变化无关
public class Demo6_Warp {public static void main(String[] args) {HeiMaStudent hs = new HeiMaStudent(new Student());//向装饰类中传入被装饰类hs.code();//javase javaweb ssh 数据库 大数据}}interface Coder {public void code();
}class Student implements Coder {//被装饰类@Overridepublic void code() {System.out.println("javase");System.out.println("javaweb");}}class HeiMaStudent implements Coder {//装饰类//1.获取装饰类的引用private Student s;//2.在构造方法中传入被装饰的对象public HeiMaStudent(Student s) {this.s = s;}//3.对原有功能升级@Overridepublic void code() {s.code();System.out.println("shh");System.out.println("数据库");System.out.println("大数据");}}

使用指定的码表读写字符

  • FileReader是使用默认码表读取文件,如果需要使用指定码表读取,那么可以使用InputStreamReader(字节流对象,编码表):字节转字符
  • FileWriter是使用默认码表写出文件,如果需要使用指定码表写出,那么可以使用InputStreamWriter(字节流对象,编码表):字符转字节
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;public class Demo7_TransIO {public static void main(String[] args) throws IOException {//demo1();//demo2();//demo3();}public static void demo3() throws UnsupportedEncodingException, FileNotFoundException, IOException {//使用BufferedReader,BufferedWriter包装类包装InputStreamReader,使其更强大BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("utf-8.txt"), "utf-8"));//更高效地读BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk"));//更高效的写int c;while((c = br.read()) != -1) {bw.write(c);}br.close();bw.close();}public static void demo2() throws UnsupportedEncodingException, FileNotFoundException, IOException {//使用指定的码表读写字符InputStreamReader isr = new InputStreamReader(new FileInputStream("utf-8.txt"), "uTf-8");  //指定码表读字符OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"), "gbk");//指定码表写字符int c;while((c = isr.read()) != -1) {osw.write(c);}isr.close();osw.close();}public static void demo1() throws FileNotFoundException, IOException {//根据默认编码表读写,出现乱码FileReader fr = new FileReader("utf-8.txt");//使用utf-8码表读(你好你好)FileWriter fw = new FileWriter("gbk.txt");//使用gbk码表写(浣犲ソ浣犲ソ)int c;while((c = fr.read()) != -1) {fw.write(c);}fr.close();fw.close();}}

包装类图解
在这里插入图片描述

递归

一.概述

  • 方法自己调用自己

二.递归的利与弊

  • 递归的弊端:不能调用次数太多,容易导致栈内存溢出
  • 递归的好处:不用知道循环次数

三.构造方法不能使用递归调用
四.递归调用是否必须有返回值?

  • 不一定(可以有,可以没有)
public class Demo8_Digui {public static void main(String[] args) {System.out.println(fun(6));}public static int fun(int n) {if(n == 1)return 1;elsereturn n * fun(n-1);}}

案例演示

获取某个文件夹下的所有.java文件,递归打印

import java.io.File;
import java.util.Scanner;public class Test5 {public static void main(String[] args) {File dir = getDir();printJavaFile(dir);}public static File getDir() {Scanner sc = new Scanner(System.in);System.out.println("请输入一个文件夹路径:");while(true) {String line = sc.nextLine();File dir = new File(line);       //封装成File文件if(!dir.exists()) {System.out.println("您输入的文件夹不存在,请重新输入:");} else if(dir.isFile()) {System.out.println("您输入的是文件,请重新输入:");} else {return dir;}}}public static void printJavaFile(File dir) {File[] subFiles = dir.listFiles();   //创建文件夹数组存储文件和文件夹for (File subFile : subFiles) {if(subFile.isFile() && subFile.getName().endsWith(".java")) {System.out.println(subFile);} else if(subFile.isDirectory()) {printJavaFile(subFile);//递归}}}}

http://chatgpt.dhexx.cn/article/pZuhFsyI.shtml

相关文章

javaIO之字符流

目录 一、简介二、字符流入流1.1FileReader构造方法1.2FileReader读取字符数据 三、字符流出流3.1 FileWriter 构造方法3.2FileWriter写入数据3.3关闭close和刷新flush3.4FileWriter的续写和换行3.5文本文件复制 四、IO异常处理五、小结 一、简介 字符流 Reader 和 Writer 的故…

字符流定义及如何深入理解字符流的编码

IputSrem类和OupuSrem类在读写文件时操作的都是字节,如果希望在程序中操作字符,使用这两个类就不太方便,为此JDK提供了字符流。同字节流样,字符流也有两个抽象的顶级父类,分别是Reader和Writer其中,Reader是…

Java:字符流

字符流的底层其实就是字节流。 字符流字节流字符集 结构体系: 1.特点 输入流:一次读一个字节,遇到中文时,一次读多个字节。 输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中。 2.使用场景 对于纯文本…

java的字符流

字符流的底层也是字节流。字符流字节流字符集。 特点是输入流一次读一个字节,遇到中文时,一次读多个字节(读多少个与字符集有关);输出流底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中。 字…

java字符流

前言 输入流:把数据(键盘输入、鼠标、扫描仪等等外设设备)读入到内存(程序)中 输出流:把内存(程序)中的数据输出到外设或其他地方,从文件角度简单总结就是,输…

字符流

3.字符流 3.1为什么会出现字符流 由于字节流操作中文不是特别方便,所以Java就提供了字符流 字符流字节流编码表 用字节流复制文本时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文&#xff0c…

字符流(字符输入流和字符输出流)

概述 当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文…

2、字符流详解

文章目录 一、字符流 (也叫转换流)1、字符输出流:Writer2、字符输入流:Reader3、字符输入流和字符输出流的简化版本4、字符缓冲流 一、字符流 (也叫转换流) 文件字符流 字符流的两个抽象父类:字符输出流:Writer 和字符输入流&…

渗透测试中的LLMNR/NBT-NS欺骗攻击

简介 LLMNR&NBT-NS 欺骗攻击是一种经典的内部网络攻击,然而由于一方面了解它的人很少,另一方面在Windows中它们是默认启用的,所以该攻击到现在仍然是有效的。在本文中,我们首先为读者解释什么是LLMNR&NBT…

如何避免LLMNR / NBT-NS欺骗攻击?

当DNS名称解析时,链路本地多播名称解析(LLMNR)和NetBIOS名称注册和解析服务(NBT-NS)会负责查找网络中所请求的主机地址。 在DNS服务器请求失败时,请求方会在整个网络中进行广播,查找所请求的主…

Active Directory 101 - LLMNR

This is the first article of my Active Directory Series. I’ll be reading through materials and try to explain the key concepts in AD and AD penetration test. Let’s cut directly to it. The Concept References: RFC from IETFLLMNR WikipediaHow LLMNR Work…

内网渗透技术之超越LLMNR/NBNS欺骗的ADIDNS欺骗攻击

利用名称解析协议中的缺陷进行内网渗透是执行中间人(MITM)攻击的常用技术。有两个特别容易受到攻击的名称解析协议分别是链路本地多播名称解析(LLMNR)和NetBIOS名称服务(NBNS)。攻击者可以利用这两种协议来…

利用 LLMNR 名称解析缺陷劫持内网指定主机会话

导读本文将会对 LLMNR 协议进行分析并用 python 实现质询和应答。后半部分则会重点阐述利用 LLMNR 在名称解析过程中的缺陷进行实战攻击的部分思路。 0x00 LLMNR 简介 从 Windows Vista 起,Windows 操作系统开始支持一种新的名称解析协议 —— LLMNR,主要…

LLMNR协议

LLMNR协议 http://en.wikipedia.org/wiki/Link-local_Multicast_Name_Resolution The Link Local Multicast Name Resolution (LLMNR) is a protocol based on the Domain Name System (DNS) packet format that allows both IPv4 and IPv6 hosts to perform name resolutio…

组播风暴引起的路由系统重启(LLMNR协议)

网络拓扑 一台路由设备连接可以上网的上级,连接方式DHCP,一台中继器,2.4G和5G同时中继到路由设备(双频中继之后,优先走5G),一台chromecast播放视频,一台ipad连接,一台网络摄像头连接…

内网渗透研究:LLMNR和NetBIOS欺骗攻击分析

目录 基础知识 LLMNR是什么? LLMNR 的工作过程 NetBIOS是什么? Windows系统名称解析顺序 LLMNR和NetBIOS欺骗攻击 攻击原理 Responder工具利用过程 针对LLMNR和NetBIOS欺骗攻击的防御 基础知识 LLMNR是什么? 链路本地多播名称解析&…

LLMNR和NetBIOS欺骗攻击分析及防范

本文首发于先知社区:https://xz.aliyun.com/t/9714 链路本地多播名称解析(LLMNR)是一个基于域名系统(DNS)数据包格式的协议,IPv4和IPv6的主机可以通过此协议对同一本地链路上的主机执行名称解析。 在DNS …

llmnr协议 名称解析缺陷劫持内网指定主机会话

目录 0x00 LLMNR 简介 0x01 LLMNR 协议分析 0x02 LLMNR 名称解析过程 0x03 编程实现 LLMNR 的质询和应答 0x04 LLMNR Poison 攻击原理 0x05 利用伪造源 IP LLMNR Poisone 劫持内网指定主机会话 0x06 LLMNR Poison 实战攻击思路 0x07 总结 0x00 LLMNR 简介 从 Windows …

NetBIOS名称欺骗和LLMNR欺骗

本文原创作者: 贺兰山缺口 原创投稿详情:重金悬赏 | 合天原创投稿等你来! NetBIOS和LLMNR简介 NetBIOS和Link-LocalMulticast NameResolution(LLMNR)是Microsoft针对工作组和域设计的名称解析协议,主要用于…

【内网学习笔记】18、LLMNR 和 NetBIOS 欺骗攻击

0、前言 如果已经进入目标网络,但是没有获得凭证,可以使用 LLMNR 和 NetBIOS 欺骗攻击对目标进行无凭证条件下的权限获取。 1、基本概念 LLMNR 本地链路多播名称解析(LLMNR)是一种域名系统数据包格式,当局域网中的…