一、I/O

分字节流和字符流

字节流由InputStream和OutputStream读入和写入

DataInputStream继承自FilterInputStream,可以读取基本数据类型(char, byte, short, int, long, double, float, boolean)和String类型

字符流有FileReader,FileWriter,StringReader,StringWriter,CharArrayReader,CharArrayWriter,BufferedReader和BufferedWriter

InputStreamReader可以把InputStream转化为Reader,而OutputStreamReader可以把OutputStream转化为Writer。

二、如何使用DataInputStream

Socket socket;

DataInputStream in = new DataInputStream( new BufferedInputStream( socket.getInputStream() ) );

in.readByte(); in.readUTF();

三、标准I/O重定向

Java的System类提供一些简单的静态方法调用,允许我们对标准I/O和错误I/O流进行重定向:

SetIn(InputStream)

SetOut(PrintStream)

SetErr(PrintStream)

I/O重定向操作的是字节流而不是字符流,因此我们是用InputStream和OutputStream而不是Reader和Writer

四、NIO

NIO与I/O最重要的区别是数据打包和传输的方式。原来的I/O以流的方式处理数据,而NIO以块的方式处理数据。

面向流的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的I/O 通常相当慢。

面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性。

通道和缓冲区是NIO中的核心对象,几乎在每一个I/O操作中都要使用它们。所有数据都通过Buffer对象来处理。您永远不会将字节直接写入通道中,相反,您是将数据写入包含一个或者多个字节的缓冲区。同样,您不会直接从通道中读取字节,而是将数据从通道读入缓冲区,再从缓冲区获取这个字节。

通道与流的不同之处在于通道是双向的。而流只是在一个方向上移动(一个流必须是InputStream或者OutputStream的子类), 而Channel可以用于读、写或者同时用于读写。因为它们是双向的,所以通道可以比流更好地反映底层操作系统的真实情况。特别是在 UNIX 模型中,底层操作系统通道是双向的。

Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。

NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。

Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生,比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。

了解了这个基本原理,我们结合代码看看使用,在使用上,也在分两个方向,一个是线程处理,一个是用非线程,后者比较简单。

五、Java如何存储数据

  1. Register,这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部。但是Register的数量极其有限,所以Register由编译器根据需求进行分配。你不能直接控制.Stack,位于通用RAM中。
  2. Heap,用于存放所有Java对象.
  3. 静态存储
  4. 常量存储
  5. 非RAM存储,例如流对象和持久化对象

JVM只能回收Heap中的内容

六、Primitive Type

Primitive type

Size

Minimum

Maximum

Wrapper type

char

16bits

Unicode 0

Unicode 215-1

Character

byte

8bits

-128

127

Byte

short

16 bits

-215

215-1

Short

int

32 bits

-231

231-1

Integer

long

64 bits

-263

263-1

Long

float

32 bits

Float

double

64 bits

Double

boolean

七、Java为什么可以移植

Java每种基本数据类型所占存储空间大小不随硬件架构变化而变化.

八、将float或者double值转成整型值后,总是将小数部分砍掉,而不是四舍五入。Math.random()范围为[0,1)。

九、java类加载原理和过程

java中默认有三种类加载器:启动类加载器,扩展类加载器,系统类加载器(也叫应用类加载器)。

启动类加载器bootstrap负责加载jre/lib中的系统类,这种类加载器都是用c语言实现的,在java程序中没有办法获得这个类加载器,对于java程序是一个概念而已,基本上不用考虑它的存在,像String,Integer这样的类都是由启动类加载器加载器的。

扩展类加载器ExtClassLoader负责加载jre/lib/ext中的类,一般使用java实现,这是一个真正的java类加载器,和普通的类加载器一样,其实这个类加载器对我们来说也不是很重要,我们可以通过java程序获得这个类加载器。

系统类加载器AppClassLoader加载第一个应用类的加载器(其实这个定义并不准确,下面你将会看到),也就是执行java MainClass 时加载MainClass的加载器,这个加载器使用java实现,使用的很广泛,负责加载classpath中指定的类。

类加载器之间有一定的关系(父子关系),我们可以认为扩展类加载器的父加载器是启动类加载器(当然不这样认为也是可以的,因为启动类加载器表现在java中就是一个null),不过系统类加载器的父加载器一定是扩展类加载器,类加载器在加载类的时候会先给父加载器一个机会,只有父加载器无法加载时才会自己去加载。

在ClassLoader.java(ExtClassLoader和AppClassLoader的间接父类)中的loadClass(name)首先在内存中查找该类是否被load进来了,如果没有load进来则依双亲委派原则进行查找,你的类装载器首先将请求传递给它的双亲类装载器,然后将这个请求一路委派直到委派给启动类装载器。则启动类装载器可以将java.ang.String类返回给你的类装载器,因为启动类装载器可以找到这个类,所以就不必在扩展类装载器中查找了,否则将在扩展类装载器查找,如果再找不到就在系统类装载器查找,如果系统类装载器也找不到就试图从网络下载这个类。不同类装载器中的类不能访问彼此的包内可见成员。另外说明一点,包名不能以java.开头,否则会抛出SecurityException。

十、类实例化途径

  1. New
  2. 调用Class或者java.lang.reflect.Constructor对象的newInstance()
  3. 调用任何对象的clone()
  4. 通过java.io.ObjectInputStream的getObject()反序列化

Java基本知识的更多相关文章

  1. Java基础知识(壹)

    写在前面的话 这篇博客,是很早之前自己的学习Java基础知识的,所记录的内容,仅仅是当时学习的一个总结随笔.现在分享出来,希望能帮助大家,如有不足的,希望大家支出. 后续会继续分享基础知识手记.希望能 ...

  2. java基础知识小总结【转】

    java基础知识小总结 在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类.此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程 ...

  3. Java基础知识系列——String

    最近晚上没有什么事(主要是不加班有单身),就复习了一下Java的基础知识.我复习Java基础知识主要是依据Java API和The Java™ Tutorials. 今天是第一篇,复习了一下Strin ...

  4. 学习Spring必学的Java基础知识

    [1] Java反射知识-->Spring IoC :http://www.iteye.com/topic/1123081 [2] Java动态代理-->Spring AOP :http: ...

  5. 学习android学习必备的java基础知识--四大内部类

    学习android必备的java基础知识--四大内部类 今天学习android课程,因为我的主专业是JAVA,但是兴趣班却有这其他专业的同学,学习android 需要具备一些java的基础知识,因此就 ...

  6. JAVA基础知识之网络编程——-网络基础(Java的http get和post请求,多线程下载)

    本文主要介绍java.net下为网络编程提供的一些基础包,InetAddress代表一个IP协议对象,可以用来获取IP地址,Host name之类的信息.URL和URLConnect可以用来访问web ...

  7. java基础知识梳理

    java基础知识梳理 1 基本数据类型

  8. java基础知识回顾之---java String final类普通方法

    辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      ...

  9. java基础理论知识的一些总结

    在学习Java初期,由于我们是刚开始接触Java,我们不仅需要牢牢掌握Java的基础理论知识,来为我们后面对Java更深层次的学习打好基础,而且我们需要养成编程人的思想习惯.来我们一起来探索Java基 ...

  10. Java 基础知识(一)

    Java基础知识篇: 一.关键字解释 1. final:修饰非抽象类,非抽象方法和属性, 以及修饰方法参数,代表“无法改变的”.出于对设计或者效率的考虑使用该关键字. final类无法被继承,fina ...

随机推荐

  1. hadoop集群安装

    首现非常感谢 虾皮(http://www.cnblogs.com/xia520pi/archive/2012/05/16/2503949.html) 安装过程是参照他的<Hadoop集群(第5期 ...

  2. 对Git的一些理解

    使用Git都快2年了,能够说熟练使用git,遇到不会的也可以自己查询git帮助手册.平时可以根据shell的管道命令,组合一些命令比如git show commitID | grep “diff”来看 ...

  3. MacOSX 中如何动态隐藏Dock Icon

    XCode创建了一个GUI工程,程序分几种运行模式,一种是agent模式,还有一种是GUI界面.Agent模式是没有界面的GUI程序,通过LaunchAgents启动.创建出来的Info.plist默 ...

  4. MySQL(root用户)密码重置

    分别在Windows下和Linux下重置了MYSQL的root的密码:  在windows下: 1:进入cmd,停止mysql服务:Net stop mysql    到mysql的安装路径启动mys ...

  5. Web前端优化需要注意的点

    关键在于:如何提高页面访问速度:如何减少服务器负载和带宽压力: 1.      cache:包括数据库表的缓存,浏览器缓存,服务器端缓存(代理服务器缓存,CDN缓存,反向代理服务器缓存),web应用程 ...

  6. 记那一次C++开发电话面试

    题目一: linux进程间通信(IPC)有几种方式,下面将将简单的简述一下: 一.管道(pipe) 管道是Linux支持的最初IPC方式,管道可分为无名管道,有名管道等. (一)无名管道,它具有几个特 ...

  7. ASP.Net MVC C#画图 页面调用

    /////C# 后台代码 public FileContentResult PieChart()        {            TransactionStatisticsBLL bll = ...

  8. 办理康卡迪亚大学(本科)学历认证『微信171922772』Concordia学位证成绩单使馆认证Concordia University

    办理康卡迪亚大学(本科)学历认证『微信171922772』Concordia学位证成绩单使馆认证Concordia University Q.微信:171922772办理教育部国外学历学位认证海外大学 ...

  9. java基础练习 6

    public class Sixth { /*一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程 找出1000以内的所有完数.*/ public sta ...

  10. 数据持久层框架iBatis, Hibernate 与 JPA 比较

    在本文中我们介绍并比较两种最流行的开源持久框架:iBATIS和Hibernate,我们还会讨论到Java Persistence API(JPA).我们介绍每种解决方案并讨论其所规定的品质,以及在广泛 ...