打印流
打印流:有两种
PrintStream字节打印流
PrintWriter字符打印流
特点1:打印流不操作数据源,只能操作目的地
特点2:特有的写出方法,可以实现数据原样写出
例如:
打印:97 文件中:97
打印:true 文件中:true
特点3:特有的写出方法,可以实现自动刷新,自动换行
打印一次数据 = 写出 + 换行 + 刷新
PrintStream字节打印流
字节打印流的构造方法:
public PrintStream(OutputStream/File/String) 关联 字节输出流/文件/文件路径
public PrintStream(String fileName, Charset charset) 指定字符编码
public PrintStream(OutputStreamout, boolean autoFlush) 自动刷新
public PrintStream(OutputStream out, boolean autoFlush, String encoding)指定字符编码且自动刷新
字节打印流的成员方法:
public void write(int b) 常规方法:规则跟之前一样,将指定的字节写出
特有方法将数据原样写出。
public void println(Xxx xx) 特有方法:打印任意数据,自动刷新,自动换行
public void print(Xxx xx) 特有方法:打印任意数据,不换行
public void printf(String format, Object... args) 特有方法:带有占位符的打印语句,不换行字节流底层没有缓冲区,开不开自动刷新都一样。直接写出数据到文件中。
public class PrintStreamDemo1 {
public static void main(String[] args) throws FileNotFoundException {
/*
字节打印流:
构造方法
public PrintStream(OutputStream/File/String) 关联字节输出流/文件/文件路径
public PrintStream(String fileName, Charset charset) 指定字符编码
public PrintStream(OutputStreamout, boolean autoFlush) 自动刷新
public PrintStream(OutputStream out, boolean autoFlush, String encoding) 指定字符编码且自动刷新
成员方法:
public void write(int b) 常规方法:规则跟之前一样,将指定的字节写出
public void println(Xxx xx) 特有方法:打印任意数据,自动刷新,自动换行
public void print(Xxx xx) 特有方法:打印任意数据,不换行
public void printf(String format, Object... args) 特有方法:带有占位符的打印语句,不换行
*/
//1.创建字节打印流的对象
PrintStream ps = new PrintStream(new FileOutputStream("myio\\a.txt"), true, Charset.forName("UTF-8"));
//2.写出数据
ps.println(97);//写出 + 自动刷新 + 自动换行
ps.print(true);//true
ps.println();
ps.printf("%s爱上了%s","阿珍","阿强");//%s字符串的占位符
//3.释放资源
ps.close();
}
}
PrintWriter字符打印流
字符打印流的构造方法:
public PrintWriter(Write/File/String) 关联字节输出流/文件/文件路径
public PrintWriter(String fileName, Charset charset) 指定字符编码
public PrintWriter(Write, boolean autoFlush) 自动刷新
public PrintWriter(Write out, boolean autoFlush, String encoding) 指定字符编码且自动刷新
字符打印流的成员方法:
public void write(int b) 常规方法:规则跟之前一样,将指定的字节写出
public void println(Xxx xx) 特有方法:打印任意数据,自动刷新,自动换行
public void print(Xxx xx) 特有方法:打印任意数据,不换行
public void printf(String format, Object... args) 特有方法:带有占位符的打印语句,不换行字符流底层有缓冲区,想要自动刷新需要开启。
public class PrintStreamDemo3 {
public static void main(String[] args) throws IOException {
/*
字符打印流:
构造方法
public PrintWriter(Write/File/String) 关联字节输出流/文件/文件路径
public PrintWriter(String fileName, Charset charset) 指定字符编码
public PrintWriter(Write, boolean autoFlush) 自动刷新
public PrintWriter(Write out, boolean autoFlush, String encoding) 指定字符编码且自动刷新
成员方法:
public void write(int b) 常规方法:规则跟之前一样,将指定的字节写出
public void println(Xxx xx) 特有方法:打印任意数据,自动刷新,自动换行
public void print(Xxx xx) 特有方法:打印任意数据,不换行
public void printf(String format, Object... args) 特有方法:带有占位符的打印语句,不换行
*/
//1.创建字符打印流的对象
PrintWriter pw = new PrintWriter(new FileWriter("myio\\a.txt"),true);
//2.写出数据
pw.println("今天你终于叫我名字了,虽然叫错了,但是没关系,我马上改");
pw.print("你好你好");
pw.printf("%s爱上了%s","阿珍","阿强");
//3.释放资源
pw.close();
}
}
public class PrintStreamDemo2 {
public static void main(String[] args) throws FileNotFoundException {
PrintStream ps = new PrintStream("D:\\JavaTest\\myio\\myio\\a.txt");
//% n表示换行
ps.printf("我叫%s %n", "阿玮");//我叫阿玮
ps.printf("%s喜欢%s %n", "阿珍", "阿强");//阿珍喜欢阿强
ps.printf("字母H的大写:%c %n", 'H');//字母H的大写:H
ps.printf("8>3的结果是:%b %n", 8 > 3);// 8>3的结果是:true
ps.printf("100的一半是:%d %n", 100 / 2);// 100的一半是:50
ps.printf("100的16进制数是:%x %n", 100);//100的16进制数是:64
ps.printf("100的8进制数是:%o %n", 100);//100的8进制数是:144
ps.printf("50元的书打8.5折扣是:%f元%n", 50 * 0.85);//50元的书打8.5折扣是:42.500000元
ps.printf("计算的结果转16进制:%a %n", 50 * 0.85);//计算的结果转16进制:0x1.54p5
ps.printf("计算的结果转科学计数法表示:%e %n", 50 * 0.85);//计算的结果转科学计数法表示:4.250000e+01
ps.printf("计算的结果转成指数和浮点数,结果的长度较短的是:%g %n", 50 * 0.85);
//计算的结果转成指数和浮点数,结果的长度较短的是:42.5000
ps.printf("带有百分号的符号表示法,以百分之85为例:%d%% %n", 85);
//带有百分号的符号表示法,以百分之85为例:85%
ps.println("---------------------");
double num1 = 1.0;
ps.printf("num: %.4g %n", num1);//num: 1.000
ps.printf("num: %.5g %n", num1);//num: 1.0000
ps.printf("num: %.6g %n", num1);//num: 1.00000
float num2 = 1.0F;
ps.printf("num: %.4f %n", num2);//num: 1.0000
ps.printf("num: %.5f %n", num2);//num: 1.00000
ps.printf("num: %.6f %n", num2);//num: 1.000000
ps.println("---------------------");
ps.printf("数字前面带有0的表示方式:%03d %n", 7);//数字前面带有0的表示方式:007
ps.printf("数字前面带有0的表示方式:%04d %n", 7);//数字前面带有0的表示方式:0007
ps.printf("数字前面带有空格的表示方式:% 8d %n", 7);//数字前面带有空格的表示方式: 7
ps.printf("整数分组的效果是:%,d %n", 9989997);//整数分组的效果是:9,989,997
ps.println("---------------------");
//最终结果是10位,小数点后面是5位,不够在前面补空格,补满10位
//如果实际数字小数点后面过长,但是只规定两位,会四舍五入
//如果整数部分过长,超出规定的总长度,会以实际为准
ps.printf("一本书的价格是:%2.5f元%n", 49.8);//一本书的价格是:49.80000元
ps.printf("%(f%n", -76.04);//(76.040000)
//%f,默认小数点后面7位,
//<,表示采取跟前面一样的内容
ps.printf("%f和%3.2f %n", 86.04, 1.789651);//86.040000和1.79
ps.printf("%f和%<3.2f %n", 86.04, 1.789651);//86.040000和86.04
ps.println("---------------------");
Date date = new Date();
// %t 表示时间,但是不能单独出现,要指定时间的格式
// %tc 周二 12月 06 22:08:40 CST 2022
// %tD 斜线隔开
// %tF 冒号隔开(12小时制)
// %tr 冒号隔开(24小时制)
// %tT 冒号隔开(24小时制,带时分秒)
ps.printf("全部日期和时间信息:%tc %n", date);//全部日期和时间信息:周日 10月 06 18:05:37 CST 2024
ps.printf("月/日/年格式:%tD %n", date);//月/日/年格式:10/06/24
ps.printf("年-月-日格式:%tF %n", date);//年-月-日格式:2024-10-06
ps.printf("HH:MM:SS PM格式(12时制):%tr %n", date);//HH:MM:SS PM格式(12时制):06:05:37 下午
ps.printf("HH:MM格式(24时制):%tR %n", date);//HH:MM格式(24时制):18:05
ps.printf("HH:MM:SS格式(24时制):%tT %n", date);//HH:MM:SS格式(24时制):18:05:37
System.out.println("---------------------");
ps.printf("星期的简称:%ta %n", date);//星期的简称:周日
ps.printf("星期的全称:%tA %n", date);//星期的全称:星期日
ps.printf("英文月份简称:%tb %n", date);//英文月份简称:10月
ps.printf("英文月份全称:%tB %n", date);//英文月份全称:十月
ps.printf("年的前两位数字(不足两位前面补0):%tC %n", date);//年的前两位数字(不足两位前面补0):20
ps.printf("年的后两位数字(不足两位前面补0):%ty %n", date);//年的后两位数字(不足两位前面补0):24
ps.printf("一年中的第几天:%tj %n", date);//一年中的第几天:280
ps.printf("两位数字的月份(不足两位前面补0):%tm %n", date);//两位数字的月份(不足两位前面补0):10
ps.printf("两位数字的日(不足两位前面补0):%td %n", date);//两位数字的日(不足两位前面补0):06
ps.printf("月份的日(前面不补0):%te %n", date);//月份的日(前面不补0):6
System.out.println("---------------------");
ps.printf("两位数字24时制的小时(不足2位前面补0):%tH %n", date);//两位数字24时制的小时(不足2位前面补0):18
ps.printf("两位数字12时制的小时(不足2位前面补0):%tI %n", date);//两位数字12时制的小时(不足2位前面补0):06
ps.printf("两位数字24时制的小时(前面不补0):%tk %n", date);//两位数字24时制的小时(前面不补0):18
ps.printf("两位数字12时制的小时(前面不补0):%tl %n", date);//两位数字12时制的小时(前面不补0):6
ps.printf("两位数字的分钟(不足2位前面补0):%tM %n", date);//两位数字的分钟(不足2位前面补0):05
ps.printf("两位数字的秒(不足2位前面补0):%tS %n", date);//两位数字的秒(不足2位前面补0):37
ps.printf("三位数字的毫秒(不足3位前面补0):%tL %n", date);//三位数字的毫秒(不足3位前面补0):622
ps.printf("九位数字的毫秒数(不足9位前面补0):%tN %n", date);//九位数字的毫秒数(不足9位前面补0):622000000
ps.printf("小写字母的上午或下午标记(英):%tp %n", date);//小写字母的上午或下午标记(英):下午
ps.printf("小写字母的上午或下午标记(中):%tp %n", date);//小写字母的上午或下午标记(中):下午
ps.printf("相对于GMT的偏移量:%tz %n", date);//相对于GMT的偏移量:+0800
ps.printf("时区缩写字符串:%tZ%n", date);//时区缩写字符串:CST
ps.printf("1970-1-1 00:00:00 到现在所经过的秒数:%ts %n", date);//1970-1-1 00:00:00 到现在所经过的秒数:1728209137
ps.printf("1970-1-1 00:00:00 到现在所经过的毫秒数:%tQ %n", date);//1970-1-1 00:00:00 到现在所经过的毫秒数:1728209137622
ps.close();
}
}