- 浏览: 119497 次
- 性别:
- 来自: 广西
文章分类
最新评论
-
greemqqran:
这方法 源码,是怎么的哦?
可变参数,数组与集合之间的转换 -
greemqqran:
Arrays.asList
可变参数,数组与集合之间的转换 -
ricoyu:
引用? super E:接收的是E类型对象应该是: ? sup ...
泛型-
IO: 字节流: 针对的字节数据,包括文本也包括媒体数据,如果是纯文本用字符流处理较为便捷。 字节流所使用的缓冲区是一个byte[]。 常用的对象: FileInputStream,FileOutputStream,BufferedInputStream,BufferedOutputStream。 需求: copyMp3 public void copyMp3() { FileInputStream fis = new FileInputStream("1.mp3"); BufferedInputStream bufis = new BufferedInputStream(fis); FileOutputStream fos = new FileOutputStream("2.mp3"); BufferedOutputStream bufos = new BufferedOutputStream(fos); int by = 0; while((by=bufis.read())!=-1) { bufos.write(by); bufos.flush(); } bufos.close(); bufis.close(); } 模拟BufferedInputStream。原理:其实将一个字节数组进行封装,通过方法将一批数据存入数组中,在通过数组的指针每一次返回数组中一个字节。当数组元素全部取出后,在存入一批新的数据,重复此过程。 class MyBufferedInputStream { private InputStream in; private byte[] arr = new byte[1024*4]; private int pos = 0,count = 0; MyBufferedInputStream(InputStream in) { this.in = in ; } public int myRead()throws IOException { if(count==0) { count = in.read(arr); if(count<0) return -1; pos = 0; byte b = arr[pos]; pos++; count--; return b;//return b&255; } else if(count>0) { byte b = arr[pos]; pos++; count--; return b;//return b&0xff; } return -1; } public void myClose()throws IOException { in.close(); } } 当使用自定义的缓冲区时,居然出现的秒杀的情况,为什么会如此呢? 因为mp3数据最终的二进制表现形式中,很容易出现连续N多1的情况, 只要出现了连续的8个1,对于一个字节而言十进制体现形式就是-1。 那么就满足while循环结束条件。程序终止。 为了避免这种情况,在读到一个字节时,将该字节进行了提升变成int型。 但是byte-1,变成int 还是-1。为了避免,在进行提升的过程中,保留的源字节的8为数据,并在前以补零方式进行提升。 这样一个byte -1 变成了int 的255。这就避免了-1的情况。 如何补的零呢?只要将读到的字节&255或者&0xFF.都可以。这也是read方法不是返回byte而返回int类型的原因。 通过该过程就可以明确,read方法在对字节或者字符进行提升,而write方法在对提升后的int数据进行强转, 只写出了最低的8位,或者最低的16位。 --------------------------------- 字符流: 四个: 字节流: 四个。 为了实现字符和字节流之间的转换,出现了转换流。 转换流的由来, 当读到的字节数据都是纯文本的时候,而且文本中出现中文字符,那么在解析该字节数据时就需要指定编码表。 因为可以识别中的编码表不唯一。在使用转换流时,如果未指定编码表,那么默认使用本地码表。 InputStramReader:字节通向字符的桥梁 OutputStreamWriter:字符通向字节的桥梁 -------------------------------- 流操作的基本规律: 1,明确数据源和数据目的。 明确到底是使用输入流还是输出流。 2,明确要处理的数据是否是纯文本。 明确到底是使用字符流还是字节流。 当明确体系后,到底该用该体系的哪个对象呢? 根据数据存在的设备而定, 数据源所在设备可以是,硬盘,键盘,内存。 数据目的所在设备可以是,硬盘,控制台,内存。 需求: 获取键盘录入,将录入信息存储到本地文件中。 源:键盘录入,输入流。 处理的数据:纯文本,字符输入流。Reader 该用哪个对象呢? 键盘录入System.in完成的。那么它是一个标准的字节输入流。InputStream。 为了操作文本数据方便,将字节流转换成字符流。使用InputStreamReader。 但是为了提高对字符操作的效率,BufferedReader. BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); 目的:本地文件(硬盘)输出流。 处理的数据:纯文本,字符输出流。Writer。 该用该体系的哪个对象呢? 可以操作的文件FileWriter对象。 为了提高写入流的效率。BufferedWriter. public void show() { BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt")); String line = null; while((line=bufr.readLine())!=null) { if("over".equals(line)) break; bufw.write(line); bufw.newLine(); bufw.flush(); } bufw.close(); bufr.close(); } /* 如果基本上面的分析,但不使用缓冲区,代码是一个什么样子呢? */ public static void show()throws IOException { InputStreamReader isr = new InputStreamReader(System.in); FileWriter fw = new FileWriter("a.txt"); char[] arr = new char[1024]; int len = 0; while((len=isr.read(arr))!=-1) { System.out.println(len); String s = new String(arr,0,len-2); if("over".equals(s)) break; fw.write(arr,0,len); fw.flush(); } fw.close(); isr.close(); } 获取本地文本数据,将数据息存储到本地另一个文件中,按照UTF-8的编码形式。 源:硬盘,输入流。 数据:纯文本,字符输入流,Read。 该用哪个对象呢? 因为是文件FileReader为了提高效率BufferedReader. 目的:本地文件(硬盘)输出流。 处理的数据:纯文本,字符输出流。Writer。 该用该体系的哪个对象呢? 可以操作的文件的对象,但是因为要将字符数据进行编码在进行存储,就需要使用字符向字节过滤的桥梁。OutputStreamWriter. 就要使用转换流。而转换流要接收的对象都是字节流对象。所以要使用的可以操作的File的FileOutputStream。 为了提高写入流的效率。BufferedWriter. public void show() { BufferedReader bufr = new BufferedReader(new FileReader("a.txt)); BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8")); } ----------------------------- 异常日志。 printStackTrace(PrintStream ); try { int[] arr = new int[2]; System.out.println(arr[3]); } catch(Exception e) { Date d = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = sdf.format(d); try { PrintStream out = new PrintStream("exception.log"); e.printStackTrace(out); out.close(); } catch(IOException e) { throw new RuntimeException("日志建立失败"); } }
发表评论
-
动态代理+注解实现用户权限控制
2012-12-23 00:01 1333首先第一步我们需要定义一个接口UserDao p ... -
JDK动态代理模式
2012-12-22 21:51 897package cn.dhcool.dynamic.proxy ... -
代理proxy模式
2012-12-22 20:45 0静态代理模式: 需要有一个公共的借口,还有一个真实的实现类, ... -
工厂模式下出现的问题-null异常
2012-12-15 18:31 916遇到了一个问题: public class Dao ... -
内部类详解
2011-12-09 21:23 653从Java1.1开始引入了内部类以来,它就引起了人们的激烈争论 ... -
动态代理实现
2011-11-22 02:03 1040package com.dhcool.proxy; ... -
内省总结
2011-11-19 02:43 821package com.dhcool.introspec ... -
线程锁
2011-10-10 13:27 817sleep(), wait(),yield(),这3个方法,s ... -
类似百度谷歌分页算法实现
2011-09-08 15:58 1576<%@ page language="j ... -
充当服务端代码
2011-08-05 16:53 670import java.net.*; import java ... -
获取文件中邮件的示例
2011-08-05 12:25 733import java.util.regex.*; impo ... -
正则表达式常用字符
2011-08-05 12:22 908构造 匹配 字符 x 字符 x ... -
正则表达式
2011-08-05 12:16 837第一种:1.定义匹配规则如:String qqreg = &q ... -
InetAddress
2011-08-04 21:59 899import java.net.*; class Inet ... -
B/S socket
2011-08-04 21:08 1027import java.net.*; import java ... -
TCP多线程文件上传
2011-08-04 14:51 891/* 上传图片 */ import java.io.*; ... -
网络编程基础
2011-08-04 14:25 837网络编程: 网络通讯中所需要了解的一些内容。 T ... -
一道题
2011-08-02 21:05 610/* 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 ... -
TCP
2011-08-02 20:46 770import java.net.*; import ja ... -
UDP
2011-08-02 20:35 856import java.net.*; import java ...
相关推荐
在Linux 环境下,默认情况下所有的Socket 都是阻塞的,一个典型的读操作流程大概是这样:当用户进程调用了recvfrom 这个系统调用,kernel 就开始了IO 的第一个阶段:准备数据。对于 network io 来说,很多时候数据在...
虽然这两个库在运行时可能不是必需的,但在开发和测试阶段对确保 `socket.io-client` 功能的正确性至关重要。 总结起来,`android io.socket.client.zip` 包含的这些组件共同构成了Android平台上使用 `socket.io` ...
这里,`s3c2410_map_io`函数会在系统初始化阶段被调用,将`s3c2410_io_desc`数组中的映射信息注册到内核中。`IIS_BASE_VIRT`代表的是IIS寄存器映射后的虚拟地址。 #### 五、总结 通过上述介绍,可以看出Linux内核...
本文主要介绍了如何通过读写寄存器来诊断和解决IO问题,主要聚焦于kernel阶段和Uboot阶段的排查方法。 1.1 kernel阶段使用io命令确认寄存器方法: 在kernel阶段,如果遇到IO引脚配置正确但实际信号异常的情况,可能...
新款控制柜DSQC1030 IO板卡作为新一代产品,相比之前常用的DSQC652板卡,在多个方面进行了升级,提高了系统的集成度和扩展性。 ##### 2. 技术特点 - **通信协议**:DSQC1030使用的是EthernetIP协议,这使得它能够...
IO请求的处理主要包括以下几个阶段: 1. **请求提交**: 文件系统层通过`submit_bio`函数提交读写请求,并将相应的读写标志添加到`bio`结构中。 2. **请求合法性检查**: 检查`bio`的合法性,确保每个`bio`都包含正确...
### AVR单片机IO口、定时器和按键编程总结 #### 一、定时器2的溢出中断控制灯的闪烁 在本节中,我们主要讨论如何利用AVR单片机中的定时器2来实现LED灯的闪烁。定时器2是AVR单片机中的一个16位定时/计数器,它可以...
总结来说,Linux下的IO口驱动涉及到内核驱动编写、GPIO框架、中断处理等多个方面。通过理解这些概念和技术,开发者可以灵活地控制硬件IO口,实现各种应用场景的需求。在实际操作中,还需结合具体的硬件平台和Linux...
总结来说,Java IO复用是提升服务器高并发处理能力的关键技术,通过epoll等高效的IO复用机制,服务器可以更有效地管理大量并发连接,优化资源利用率,从而提高整体的服务质量和吞吐量。在实际开发中,理解并熟练应用...
总结起来,Java IO模型1涵盖了同步与异步、阻塞与非阻塞的基本概念,以及五种不同的IO处理方式,每种都有其适用场景和优缺点,开发者需要根据具体需求选择合适的IO模型。对于高并发、高效率的网络应用,通常会选择非...
PCI9054是一款常用的PCI...总结,PCI9054的I/O读写操作涉及到硬件配置、总线事务、中断处理和软件编程等多个方面。理解和掌握这一过程对于开发涉及PCI设备的应用至关重要,能够帮助开发者有效地控制和优化系统性能。
《杭州盈控 H800 IO硬件安装选型手册》是一款专为工业自动化领域设计的指导性文献,旨在帮助用户正确地选择、安装和配置杭州盈控的H800系列IO(输入/输出)硬件。该手册包含了丰富的技术信息和实用的操作指南,确保...
总结以上知识点,C语言和Linux操作系统是计算机科学与工程领域的基石。掌握它们,对于任何一个想要在IT行业中取得成功的技术人员来说,都是必不可少的基本技能。同时,对数据结构和I/O操作的深入理解和熟练运用,将...
总结以上信息,使用普通IO口驱动LCD需要我们对LCD的基本工作原理有深入的理解,包括液晶的物理性质以及如何通过改变电压来控制其显示状态。此外,采用多路复用技术以及对I/O口电平的精细控制是实现LCD显示的关键。...
总结来说,MSDOS.SYS、COMMAND.SOM和IO.SYS是MS-DOS操作系统的核心组件,它们共同构成了DOS启动和交互的基础。尽管随着时间的推移,Windows系统逐渐转向更先进的NT内核,但这些DOS时代遗留下来的文件在Windows XP中...
这个函数主要用在设备初始化阶段,根据设备的物理地址(bus address)返回一个可安全使用的内核虚拟地址(kernel virtual address)。 ioremap的工作原理: 1. ioremap首先检查是否有已存在的映射,如果存在,则...
实验1 IO口读写实验1主要关注的是计算机硬件与外部设备之间的交互,特别是通过I/O端口进行数据的读取和写入。在这个实验中,我们重点学习和掌握两个重要的集成电路:74HC245和74HC373,并使用Proteus软件进行流程图...
MCU的IO口在系统初始化时,包括重置阶段,其电平状态可能会对整个系统的功能产生直接影响。这通常涉及到IO口的上拉、下拉电阻配置以及模式设置。 在描述的问题中,MCU的一个输出IO口在重置时呈现微上拉状态。这意味...