互联网Java工程师面试题·Java 总结篇·第七弹

news2025/2/26 18:10:01

目录

68、Java 中如何实现序列化,有什么意义?

69、Java 中有几种类型的流?

70、写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

71、如何用 Java 代码列出一个目录下所有的文件?


68、Java 中如何实现序列化,有什么意义?

        序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决对象流读写操作时可能引发的问题(如果不进行序列化可能会存在数据乱序的问题)。

        要实现序列化,需要让一个类实现 Serializable 接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过 writeObject(Object)方法就可以将实现对象写出(即保存其状态);如果需要反序列化则可以用一个输入流建立对象输入流,然后通过 readObject 方法从流中读取对象。序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆(可以参考第 29 题)。

互联网Java工程师面试题·Java 总结篇·第三弹-CSDN博客


69、Java 中有几种类型的流?

        字节流和字符流。字节流继承于 InputStream、OutputStream,字符流继承于Reader、Writer。在 java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。关于 Java 的 I/O 需要注意的有两点:

一是两种对称性(输入和输出的对称性,字节和字符的对称性);

二是两种设计模式(适配器模式和装潢模式)。

另外 Java 中的流不同于 C#的是它只有一个维度一个方向。

面试题 - 编程实现文件拷贝。(这个题目在笔试的时候经常出现,下面的代码给出了两种实现方案)

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public final class MyUtil {
    private MyUtil() {
        throw new AssertionError();
    }
    public static void fileCopy(String source, String target) throws
IOException {
        try (InputStream in = new FileInputStream(source)) {
            try (OutputStream out = new FileOutputStream(target)) {
                byte[] buffer = new byte[4096];
                int bytesToRead;
                while((bytesToRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
                }
            }
        }
}
    public static void fileCopyNIO(String source, String target) throws
IOException {
    try (FileInputStream in = new FileInputStream(source)) {
        try (FileOutputStream out = new FileOutputStream(target)) {
            FileChannel inChannel = in.getChannel();
            FileChannel outChannel = out.getChannel();
            ByteBuffer buffer = ByteBuffer.allocate(4096);
            while(inChannel.read(buffer) != -1) {
                buffer.flip();
                outChannel.write(buffer);
                buffer.clear();
                }
            }
        }
    }
}

注意:上面用到 Java 7 的 TWR,使用 TWR 后可以不用在 finally 中释放外部资源 ,从而让代码更加优雅。


70、写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

代码如下:

import java.io.BufferedReader;
import java.io.FileReader;

public final class MyUtil {
// 工具类中的方法都是静态方式访问的因此将构造器私有不允许创建对象(绝对好习惯)
private MyUtil() {
    throw new AssertionError();
}
/**
* 统计给定文件中给定字符串的出现次数
*
* @param filename 文件名
* @param word 字符串
* @return 字符串在文件中出现的次数
*/
public static int countWordInFile(String filename, String word) {
    int counter = 0;
    try (FileReader fr = new FileReader(filename)) {
        try (BufferedReader br = new BufferedReader(fr)) {
            String line = null;
            while ((line = br.readLine()) != null) {
                int index = -1;
                while (line.length() >= word.length() && (index =
line.indexOf(word)) >= 0) {
                    counter++;
                    line = line.substring(index + word.length());
                }
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return counter;
}
}

71、如何用 Java 代码列出一个目录下所有的文件?

如果只要求列出当前文件夹下的文件,代码如下所示:

import java.io.File;

class Test12 {

public static void main(String[] args) {
    File f = new File("/Users/Hao/Downloads");
    for(File temp : f.listFiles()) {
        if(temp.isFile()) {
            System.out.println(temp.getName());
            }
        }
    }
}

如果需要对文件夹继续展开,代码如下所示:

import java.io.File;

class Test12 {

    public static void main(String[] args) {
        showDirectory(new File("/Users/Hao/Downloads"));

        }
    public static void showDirectory(File f) {
         _walkDirectory(f, 0);
        }
    private static void _walkDirectory(File f, int level) {
        if(f.isDirectory()) {
            for(File temp : f.listFiles()) {
                _walkDirectory(temp, level + 1);
            }
        }
        else {
            for(int i = 0; i < level - 1; i++) {
                System.out.print("\t");
            }
            System.out.println(f.getName());
        }
    }
}

在 Java 7 中可以使用 NIO.2 的 API 来做同样的事情,代码如下所示:

class ShowFileTest {
   
 public static void main(String[] args) throws IOException {
        Path initPath = Paths.get("/Users/Hao/Downloads");
        Files.walkFileTree(initPath, new SimpleFileVisitor<Path>() {
         
   @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributesattrs)
            throws IOException {
        System.out.println(file.getFileName().toString());
            return FileVisitResult.CONTINUE;
        }
        });
    }
}

要想了解更多:

千题千解·Java面试宝典_时光の尘的博客-CSD

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1108037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatglm2微调—Lora

1.使用ChatGLM-Efficient-Tuning框架 官网下载https://github.com/hiyouga/ChatGLM-Efficient-Tuning 或者国内镜像https://gitee.com/mirrors/chatglm-efficient-tuning 推荐一些写的不错的链接以及官网readme ChatGLM2-6B微调 - 掘金 (juejin.cn) 基于 PEFT 的高效 Chat…

78.C++ STL set/multiset容器

目录 1.什么是set和multiset 2.set和multiset的区别&#xff1a; 3.树的简单知识&#xff1a; 4.构造函数和赋值函数 5.set大小和交换 6.set插入和删除 7.set查找和统计 1.什么是set和multiset set 和 multiset 是 C 标准库中的关联容器&#xff0c;底层结构是用二叉树实…

算法专题:双指针

目录 题目1&#xff1a;移动零 题目2&#xff1a;复写零 题目3&#xff1a;快乐数 题目4&#xff1a;最多水的容器 题目5&#xff1a;有效三角形的个数 题目6&#xff1a;两数之和为s 题目1&#xff1a;移动零 给定一个数组nums&#xff0c;编写一个函数将所有的0移动到数…

java学生通讯录管理系统

设计要求 本课程设计&#xff0c;涉及输入输出、GUI设计、数据库操作等本课程重要概念和编程技能&#xff0c;全面巩固和加深学生对java程序设计的相关概念的理解&#xff0c;全面强化java编程技能&#xff0c;培养学生综合运用所学知识和技能分析问题和解决问题的能力。培养学…

消息队列-链表动态申请

一、链表的介绍 链表是一种常用的数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。 C语言消息队列链表是一种使用链表实现的队列模块&#xff0c;可以用于在程序中实现消息队列的功能。C语言消息队列链表是一种自定义的数据结构&…

热门影视APP系统源码 可二开 后端+app+搭建教程

影视APP源码绿豆二开版 后端app搭建教程都在压缩包里&#xff0c;搭建步骤和绿豆一样 安装宝塔 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 安装环境 Nginx 1.20.2 MySQL5.6-5.7 php7.0-7.…

C++特性——引用与指针详解

文章目录 引用1. 引用的作用1.1 引用可以做函数参数&#xff1a;1.2 引用做函数返回值&#xff1a; 2 常引用3 引用和指针3.1 引用和指针在语法层面和底层的异同3.1 引用和指针的不同 引用 简单来说&#xff0c;引用就是给一个变量起一个别名。例如&#xff1a; int a 1; in…

【数之道 05】走进神经网络模型、机器学习的世界

神经网络 神经网络&#xff08;ANN&#xff09;神经网络基础激活函数 神经网络如何通过训练提高预测准确度逆向参数调整法 &#xff08;BackPropagation&#xff09;梯度下降法链式法则增加一层 b站视频连接 神经网络&#xff08;ANN&#xff09; 最简单的例子&#xff0c;视…

解锁机器人技术的钥匙—《应用机器人学:运动学、动力学与控制技术》

随着科技的飞速发展&#xff0c;机器人已经广泛应用于各个领域&#xff0c;成为了当今世界的热门话题。作为一个工程师&#xff0c;如果你想在机器人行业大显身手&#xff0c;深入了解机器人运动学、动力学和控制技术是必不可少的。而《应用机器人学&#xff1a;运动学、动力学…

ERROR 1366 (HY000): Incorrect string value,mysql插入数据报错?安排

1.报错 mysql57&#xff0c;windows环境&#xff0c;插入中文数据报错 ERROR 1366 (HY000): Incorrect string value: \xC0\xEE\xCB\xC4 for column nm at row 1 2.测试语句 创建一个数据库&#xff0c;创建表&#xff0c;插入中文数据报错 1366 --创建数据库 CREATE DATABASE…

【每日一题】同积元组

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;哈希表组合 其他语言python3 写在最后 Tag 【哈希表组合】【数组】【2023-10-19】 题目来源 1726. 同积元组 题目解读 在一个由不同正整数组成的数组中找出满足 a * b c * d 的四元组 (a, b, c, d)&#xff0c;返回…

macOS查端口占用进程

java开发人员&#xff0c;端口冲突的问题基本都遇到过吧&#xff01;以下的日志是否熟悉&#xff1a; *************************** APPLICATION FAILED TO START ***************************Description:The Tomcat connector configured to listen on port 8084 failed to …

Spring Security过滤器链分析-初始化流程(8)

过滤器链分析 提起Spring Security的实现原理&#xff0c;很多读者都会想到过滤器链。因为Spring Security中的所有功能都是通过过滤器来实现的&#xff0c;这些过滤器组成一个完整的过滤器链。那么&#xff0c;这些过滤器 链是如何初始化的&#xff1f;我们前面反复提到的Aut…

【YOLO】拾遗(五)

0 YOLO系列笔记 【YOLO】朴实无华的yolov5环境配置&#xff08;一&#xff09; 【YOLO】yolov5训练自己的数据集&#xff08;二&#xff09; 【YOLO】目标识别模型的导出和opencv部署&#xff08;三&#xff09; 【YOLO】语义分割和实例分割&#xff08;四&#xff09; 1 …

Android-NDK-clang 编译 FFmpeg

Android-NDK-clang 编译 FFmpeg Android-NDK-clang 编译 FFmpeg Android-NDK-clang 编译 FFmpeg - 知乎 (zhihu.com) 前期准备 下载 Android-NDK下载 FFmpeg 源码 注意&#xff1a;笔者用的是 NDK-21 和 ffmpeg-4.4 进行编译&#xff0c;如果版本不同可能会有所不同。 测试&a…

【网络爬虫】2 初探网络爬虫

爬虫练手 把豆瓣的书评list页爬取下来&#xff0c;并获取其书名&#xff0c;和detail的连接地址 豆瓣的书评list的url地址&#xff0c; start1,2,3,4…是其地址页 https://book.douban.com/top250?start1 f12 观察其html结构 思路 按照找到的list的页面地址: 1.获取list页…

训练ChatGPT提示词,实现Excel函数操作

Excel常用表格数据处理都会离不开函数的应用。 在数据处理,数据汇总,数据展示的过程中经常需要各类函数的使用如Vlookup,Sumifs,IF 等。 例如有一份数据我们想根据销售经理的名字,查找对应的销售额。 我们先简单描述一下我们的需求: 帮我写个Excel函数,要求查找出任意销…

Electron之集成vue+vite开发桌面程序

在electron中集成vue开发桌面程序 使用我们之前创建的electron项目 创建vue 项目 命令行进入electron根目录 执行下面命令 npm create vitelatest vue -- --template vue这样就创建了一个vue项目&#xff0c;文件名是vue&#xff0c;命令行进入vue下&#xff0c;执行下面命…

react-router-dom v6版本实现Tabs路由缓存切换

目录 文章目录 概要 效果 完整代码 概要 摆了半年摊&#xff0c;好久没写代码了&#xff0c;今天有人问我怎么实现React-Router-dom类似标签页缓存。后面看了一下router的官网。很久以前用的是react-router v5那个比较容易实现。v6变化挺大&#xff0c;但了解react的机制和rea…

工业交换机定制化解决方案:光路科技的工业PoE交换机

PoE交换机能代替普通工业交换机使用吗&#xff1f; Power over Ethernet (PoE)交换机和普通工业交换机在某些情况下可以互相替代&#xff0c;但有些情况下则不太适合。PoE交换机具有额外的供电能力&#xff0c;用于同时为网络设备提供数据和电力。如果您的应用中只需要传输数据…