【Java】字节打印流

一、构造方法

创建对象首先要来看它的构造方法。

我们可以去包装基本流,也可以直接去关联文件的目的地。

但是我们要知道,就算传递的是字符串,或者是字符串所表示的路径在方法的底层它也会根据我们传递的路径去创建一个字节流的基本流 FileOutputStream

image-20240504205508256

在创建字节打印流的时候,我们还能指定字符编码。

这种方式指定字符编码不能传递字符串,只能使用 Charset.forName() 指定。

image-20240504205531022

第三种构造,在写出数据的时候,可以设置自动刷新。

image-20240504210359099

第四种构造就是将上面的两个构造综合起来了。

如果没有指定字符编码,默认使用平台默认的字符编码,IDEA默认是 UTF-8,因此如果你不写,默认就是 UTF-8

这种方式指定字符编码是可以写字符串的。

image-20240504210608522

但是字节打印流的底层是没有缓冲区的,因此开不开自动刷新都是一样的,所有的数据都会直接写到文件的目的地。

因此字节打印流我们真正关心的应该就是上面的两个构造。


二、成员方法

write方法 不是特有的,而是常规方法,既然是常规方法,那么它在write数据的时候,规则跟之前一样的。

例如小括号中写 97,那么真正写到文件目的地的是 97 在字符编码上所对应的字符 a,并且 write方法 是不能自动换行的,如果想换行还需要写 \r\n

image-20240504211203010

下面的三个成员方法就是特有的方法。

println 可以打印任意类型的数据,而且这个方法是可以自动刷新,自动换行。

image-20240504211525210

print 可以打印任意的数据,但是这个方法不换行。

image-20240504211721404

printf 是一个带有占位符的打印语句,这个方法也是不换行的。

image-20240504211736869

但由于后面三个都是特有的方法,可以实现数据原样写出。


三、代码示例

其中的 csn 其实也代表字符编码

image-20240504213651116
//1.创建字节打印流的对象
PrintStream ps = new PrintStream(new FileOutputStream("myio\\a.txt"), true, Charset.forName("UTF-8"));
//2.写出数据
ps.println(97);//写出 + 自动刷新 + 自动换行 // 数据的原样写出
ps.print(true);
ps.println();
ps.printf("%s爱上了%s","阿珍","阿强");
//3.释放资源
ps.close();

%s 是字符串的占位符,其实它还有很多很多

PrintStream ps = new PrintStream("a.txt");

//%n表示换行
ps.printf("我叫%s %n", "阿玮");
ps.printf("%s喜欢%s %n", "阿珍", "阿强");
ps.printf("字母H的大写:%c %n", 'H'); // %c可以把字符变成大写
ps.printf("8>3的结果是:%b %n", 8 > 3); // %b 是一个布尔类型的占位符,将8 > 3插在%b的地方
ps.printf("100的一半是:%d %n", 100 / 2); //%d 是一个整数占位符
ps.printf("100的16进制数是:%x %n", 100);
ps.printf("100的8进制数是:%o %n", 100);
ps.printf("50元的书打8.5折扣是:%f元%n", 50 * 0.85);
ps.printf("计算的结果转16进制:%a %n", 50 * 0.85);
ps.printf("计算的结果转科学计数法表示:%e %n", 50 * 0.85);
ps.printf("计算的结果转成指数和浮点数,结果的长度较短的是:%g %n", 50 * 0.85);
ps.printf("带有百分号的符号表示法,以百分之85为例:%d%% %n", 85);
ps.println("---------------------");

double num1 = 1.0;
ps.printf("num: %.4g %n", num1);
ps.printf("num: %.5g %n", num1);
ps.printf("num: %.6g %n", num1);

float num2 = 1.0F;
ps.printf("num: %.4f %n", num2);
ps.printf("num: %.5f %n", num2);
ps.printf("num: %.6f %n", num2);
ps.println("---------------------");

ps.printf("数字前面带有0的表示方式:%03d %n", 7);
ps.printf("数字前面带有0的表示方式:%04d %n", 7);
ps.printf("数字前面带有空格的表示方式:% 8d %n", 7);
ps.printf("整数分组的效果是:%,d %n", 9989997);
ps.println("---------------------");

//最终结果是10位,小数点后面是5位,不够在前面补空格,补满10位
//如果实际数字小数点后面过长,但是只规定两位,会四舍五入
//如果整数部分过长,超出规定的总长度,会以实际为准
ps.printf("一本书的价格是:%2.5f元%n", 49.8);
ps.printf("%(f%n", -76.04);

//%f,默认小数点后面7位,
//<,表示采取跟前面一样的内容
ps.printf("%f和%3.2f %n", 86.04, 1.789651);
ps.printf("%f和%<3.2f %n", 86.04, 1.789651);
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);
ps.printf("月/日/年格式:%tD %n", date);
ps.printf("年-月-日格式:%tF %n", date);
ps.printf("HH:MM:SS PM格式(12时制):%tr %n", date);
ps.printf("HH:MM格式(24时制):%tR %n", date);
ps.printf("HH:MM:SS格式(24时制):%tT %n", date);

System.out.println("---------------------");
ps.printf("星期的简称:%ta %n", date);
ps.printf("星期的全称:%tA %n", date);
ps.printf("英文月份简称:%tb %n", date);
ps.printf("英文月份全称:%tB %n", date);
ps.printf("年的前两位数字(不足两位前面补0):%tC %n", date);
ps.printf("年的后两位数字(不足两位前面补0):%ty %n", date);
ps.printf("一年中的第几天:%tj %n", date);
ps.printf("两位数字的月份(不足两位前面补0):%tm %n", date);
ps.printf("两位数字的日(不足两位前面补0):%td %n", date);
ps.printf("月份的日(前面不补0):%te  %n", date);

System.out.println("---------------------");
ps.printf("两位数字24时制的小时(不足2位前面补0):%tH %n", date);
ps.printf("两位数字12时制的小时(不足2位前面补0):%tI %n", date);
ps.printf("两位数字24时制的小时(前面不补0):%tk %n", date);
ps.printf("两位数字12时制的小时(前面不补0):%tl %n", date);
ps.printf("两位数字的分钟(不足2位前面补0):%tM %n", date);
ps.printf("两位数字的秒(不足2位前面补0):%tS %n", date);
ps.printf("三位数字的毫秒(不足3位前面补0):%tL %n", date);
ps.printf("九位数字的毫秒数(不足9位前面补0):%tN %n", date);
ps.printf("小写字母的上午或下午标记(英):%tp %n", date);
ps.printf("小写字母的上午或下午标记(中):%tp %n", date);
ps.printf("相对于GMT的偏移量:%tz %n", date);
ps.printf("时区缩写字符串:%tZ%n", date);
ps.printf("1970-1-1 00:00:00 到现在所经过的秒数:%ts %n", date);
ps.printf("1970-1-1 00:00:00 到现在所经过的毫秒数:%tQ %n", date);

ps.close();
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值