IT十八掌作业_java基础第十四天_IO

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IT十八掌作业_java基础第十四天_IO相关的知识,希望对你有一定的参考价值。

1.定义函数,输出一个byte的二进制字符串。

2.定义工具类,完成int数和byte[]之间的相互转换。

3.阐述IO流。

    输入输出流

    字符字节流

    缓冲和非缓冲流

    转换流.

4.通过File对象打印输出指定路径下的整个目录树结构。

5.完成文件夹复制。


---------------------------------------------

1.

package com.it18zhang.day14;


public class ByteToBin {

    public static void main(String[] args) {

        byte b1 = -128;

        byte b2 = 127;

        byte b3 = 0;

        byte b4 = -1;

        byte b5 = 1;

        System.out.println("-128的二进制字符串" + printByteBinary(b1));

        System.out.println("127的二进制字符串" + printByteBinary(b2));

        System.out.println("0的二进制字符串" + printByteBinary(b3));

        System.out.println("-1的二进制字符串" + printByteBinary(b4));

        System.out.println("1的二进制字符串" + printByteBinary(b5));

    }




    /**

     * 输出一个byte的二进制字符串

     * 

     * @param b

     * @return binary string

     */

    public static String printByteBinary(byte b) {

        // 先将byte隐式转换成int数,

        int num = b;

        // 然后将int数与256进行位或运算,将前24位都换成1。

        num |= 256;

        // 通过Integer工具类的toBinaryString打印出int的二进制字符串。

        String str = Integer.toBinaryString(num);

        int len = str.length();

        // 截取字符串的最后8位字符

        return str.substring(len - 8, len);


    }


}




2.

package com.it18zhang;

/**

 *定义工具类,完成int到byte[]之间转换

 */

public class BinToByteUtils {


public static void main(String[] args) {

//int转换成字节数组

int num = -400;

byte[] bytes = intToByteArray(num);

for(int i = 0; i<bytes.length ; i++){

System.out.println("index " + i +" = "+bytes[i]);

}

System.out.println("----------------------");

//字节数组转int

System.out.println(byteToIntArray(bytes));

}

/**

* 将int整数转换成字节数组

*/

public static byte[] intToByteArray(int param){

//一个int四个字节,一个字节8位

byte[] byteArray = new byte[4];

byte b0 = (byte)param;

byte b1 = (byte)(param >> 8);

byte b2 = (byte)(param >> 16);

byte b3 = (byte)(param >> 24);

byteArray[0] = b0;

byteArray[1] = b1;

byteArray[2] = b2;

byteArray[3] = b3;

return byteArray;

}

/**

* 将字节数组转换成int整数

*/

public static int byteToIntArray(byte[] arr){

int num =0;

if(arr.length == 4){

//将最后一个字节左移24位,称为最高位

int num3 = arr[3] << 24;

//为了消除负数类型提升后前面多余的1,采用&0xFF保留有效8位

int num2 = (arr[2] & 0xFF) <<16;

int num1 = (arr[1] & 0xFF)<<8;

int num0 = (arr[0] & 0xFF) <<0;

num = num3 | num2 | num1 | num0;

}

return num;

}

}


3.阐述IO流。

    输入输出流

    字符字节流

    缓冲和非缓冲流

    转换流.

答:

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,

IO流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。 

按数据流向分为输入输出流,主要有InputStream和OutputStream两个类及其子类

按数据类型分为字符字节流,主要有Reader和Writer两个类及其子类

为了提高IO效率,引入了缓冲技术,通过缓冲流批量读写。而非缓冲流是通过一个一个字节或者字符进行读写。

转换流是指字节流和字符流之间的转换,主要包括InputStreamReader和OutputStreamWriter两个类。



4.


package com.it18zhang;


import java.io.File;


/**

 * 通过File对象打印输出指定路径下的整个目录树结构。

 * 

 */

public class TreeDirectory {


    // 文件所在的层数

    private int fileLevel;




    public static void main(String[] args) {

        TreeDirectory rd = new TreeDirectory();

        String dirPath = "C:/Program Files";

        rd.printDir(dirPath);

        System.out.println("--------------");

        rd.readFile(dirPath);

    }




    /**

     * 生成输出格式

     * 

     * @param name

     *            输出的文件名或目录名

     * @param level

     *            输出的文件名或者目录名所在的层次

     * @return 输出的字符串

     */


    public String createPrintStr(String name, int level) {

        // 输出的前缀

        String printStr = "";

        // 按层次进行缩进

        for (int i = 0; i < level; i++) {

            printStr = printStr + "   ";

        }

        printStr = printStr + "--" + name;

        return printStr;

    }




    /**

     * 输出初始给定的目录

     * 

     * @param dirPath

     *            给定的目录

     */

    public void printDir(String dirPath) {

        // 将给定的目录进行分割

        String[] dirNameList = dirPath.split("\\\\");

        // 设定文件level的base

        fileLevel = dirNameList.length;

        // 按格式输出

        for (int i = 0; i < dirNameList.length; i++) {

            System.out.println(createPrintStr(dirNameList[i], i));

        }

    }




    /**

     * 输出给定目录下的文件,包括子目录中的文件

     * 

     * @param dirPath

     *            给定的目录

     */

    public void readFile(String dirPath) {

        // 建立当前目录中文件的File对象

        File file = new File(dirPath);

        // 取得代表目录中所有文件的File对象数组

        File[] list = file.listFiles();

        // 遍历file数组

        if (list != null) {

            for (int i = 0; i < list.length; i++) {

                if (list[i].isDirectory()) {

                    System.out.println(createPrintStr(list[i].getName(), fileLevel));

                    fileLevel++;

                    // 递归子目录

                    readFile(list[i].getPath());

                    fileLevel--;

                }

            }

        }

    }

}

5.

package com.it18zhang;



import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;


public class DirCopy {


public static void main(String[] args) {

copyDir("d:/a", "d:/b");

}


/**

* 复制文件夹

*/

private static void copyDir(String srcRoot, String srcDir, String destDir) {

if (srcRoot == null) {

srcRoot = srcDir;

}

// 源文件夹

File srcFile = new File(srcDir);

// 目标文件夹

File destFile = new File(destDir);


// 判断srcFile有效性

if (srcFile == null || !srcFile.exists()) {

return;

}

// 创建目标文件夹

if (!destFile.exists()) {

destFile.mkdirs();

}


// 判断是否文件?

if (srcFile.isFile()) {

String absPath = srcFile.getAbsolutePath();

// 取出上级目录 d:

String parentDir = new File(srcRoot).getParent();


// 取出相对的路径a

String relPath = absPath.substring(parentDir.length());

File destFile2 = new File(destDir, relPath);

// 拷贝文件

copyFile(srcRoot, srcFile.getAbsolutePath(), destDir);

}

// 目录

else {

File[] children = srcFile.listFiles();

if (children != null) {

for (File f : children) {

copyDir(srcRoot, f.getAbsolutePath(), destDir);

}

}

}

}


public static void copyDir(String srcDir, String destDir) {

copyDir(srcDir, srcDir, destDir);

}


/**

* 复制文件

*/

public static void copyFile(String srcRoot, String path, String destDir) {

try {


// 准备目录

// 取出相对的路径

String tmp = path.substring(srcRoot.length());

//获取目标文件的父目录绝对路径

String folder = new File(destDir, tmp).getParentFile().getAbsolutePath();

System.out.println(folder);

File destFolder = new File(folder);

destFolder.mkdirs();


File f = new File(path);

// fis

FileInputStream fis = new FileInputStream(path);


String newDestpath = null;

// 文件输出流

FileOutputStream fos = new FileOutputStream(new File(destFolder,

new File(path).getName()));


// 流的对拷贝

byte[] buf = new byte[1024];

int len = 0;

while ((len = fis.read(buf)) != -1) {

fos.write(buf, 0, len);

}

fis.close();

fos.close();

} catch (Exception e) {

e.printStackTrace();

}

}

}


本文出自 “菜鸟成就数据之路” 博客,转载请与作者联系!

以上是关于IT十八掌作业_java基础第十四天_IO的主要内容,如果未能解决你的问题,请参考以下文章

IT十八掌作业_java基础第十七天_QQ案例

IT十八掌作业_java基础第26天_Java基础总结/虚拟机基础

IT十八掌作业_java基础第25天_NIO

IT十八掌作业_java基础第十天_集合

IT十八掌作业_java基础第十天_集合

IT十八掌作业_java基础第十六天_GUI/socket