【第55题】输入、输出系列3-文件的天下大势

回城传送–》《JAVA筑基100例》

文章目录

  • 零、前言
  • 一、题目描述-合并多个文本文件
    • 1、题目
    • 2、解题思路
    • 3、代码详解
  • 二、题目描述-对大文件进行分割处理
    • 1、题目
    • 2、解题思路
    • 3、代码详解
  • 三、题目描述-分割后又再次合并
    • 1、题目
    • 2、解题思路
    • 3、代码详解
    • 4、多学一个知识点
  • 四、推荐专栏
  • 五、示例源码下载

零、前言

​ 今天是学习 JAVA语言 打卡的第55天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 ),读完文章之后,按解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了。

​ 因为大家都在一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

​ 学完后,自己写篇学习报告的博客,可以发布到小虚竹JAVA社区 ,供学弟学妹们参考。

​ 我的学习策略很简单,题海策略+ 费曼学习法。如果能把这100题都认认真真自己实现一遍,那意味着 JAVA语言 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

一、题目描述-合并多个文本文件

1、题目

题目:做一个合并多个文本文件的工具。

2、解题思路

创建一个类:TextFileConcatenation

使用TextFileConcatenation继承JFrame构建窗体

读取文本文件时,用的是BufferedReader类的readLine()方法读入一行数据。

将选择的多个文本文件合并到d://concatenation.txt

3、代码详解

package com.xiaoxuzhu;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
/*** Description: 合并多个文本文件工具** @author xiaoxuzhu* @version 1.0** <pre>* 修改记录:* 修改后版本	        修改人		修改日期			修改内容* 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create* </pre>* @date 2022/5/3*/public class TextFileConcatenation extends JFrame {/****/private JPanel contentPane;private JTextField textField;private File[] textFiles;private JTextArea textArea;/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {TextFileConcatenation frame = new TextFileConcatenation();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public TextFileConcatenation() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 450, 300);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));contentPane.setLayout(new BorderLayout(0, 0));setContentPane(contentPane);JPanel panel = new JPanel();contentPane.add(panel, BorderLayout.NORTH);JLabel fileLabel = new JLabel("文件夹所在位置");panel.add(fileLabel);textField = new JTextField();panel.add(textField);textField.setColumns(10);JButton button = new JButton("选择文件夹");button.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_button_actionPerformed(e);}});panel.add(button);JScrollPane scrollPane = new JScrollPane();contentPane.add(scrollPane, BorderLayout.CENTER);textArea = new JTextArea();scrollPane.setViewportView(textArea);JPanel buttonPanel = new JPanel();contentPane.add(buttonPanel, BorderLayout.SOUTH);JButton concatButton = new JButton("合并文件");concatButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {do_concatButton_actionPerformed(e);}});buttonPanel.add(concatButton);}protected void do_button_actionPerformed(ActionEvent e) {JFileChooser chooser = new JFileChooser();chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);chooser.setMultiSelectionEnabled(false);int result = chooser.showOpenDialog(this);if (result == JFileChooser.APPROVE_OPTION) {File selectFile = chooser.getSelectedFile();textField.setText(selectFile.getAbsolutePath());textFiles = selectFile.listFiles(new FileFilter() {@Overridepublic boolean accept(File pathname) {if (pathname.getAbsolutePath().endsWith(".txt")) {return true;} else {return false;}}});for (File textFile : textFiles) {textArea.append(textFile.getAbsolutePath() + "\n\r");}}}protected void do_concatButton_actionPerformed(ActionEvent e) {if (textFiles == null) {JOptionPane.showMessageDialog(this, "请选择文件文件位置!", "警告信息", JOptionPane.WARNING_MESSAGE);return;}if (textFiles.length == 0) {JOptionPane.showMessageDialog(this, "文件夹中不包括文本文件!", "警告信息", JOptionPane.WARNING_MESSAGE);return;}BufferedReader reader = null;FileWriter writer = null;try {writer = new FileWriter("d://concatenation.txt");// 创建文件输出流for (File textFile : textFiles) {// 遍历用户选择的文本文件reader = new BufferedReader(new FileReader(textFile));// 创建缓冲输入流String line;while ((line = reader.readLine()) != null) {writer.write(line);// 将读入的数据写入到文件中}}JOptionPane.showMessageDialog(this, "文件合并成功!", "提示信息", JOptionPane.INFORMATION_MESSAGE);return;} catch (IOException e1) {e1.printStackTrace();} finally {if (writer != null) {try {writer.close();} catch (IOException e1) {e1.printStackTrace();}}if (reader != null) {try {reader.close();} catch (IOException e1) {e1.printStackTrace();}}}}
}

启动:

如图

合并前:选择文件夹

如图

如图

如图

如图

合并后:

如图

二、题目描述-对大文件进行分割处理

1、题目

题目:大数据文件为了方便传输,通常会进行切割处理。

实现一个将大文件分割成多个文件的工具

2、解题思路

创建一个类:ComminuteFrame

使用ComminuteFrame继承JFrame构建窗体

ComminuteFrame 增加标签,文本框和分割按钮

创建一个类:ComminuteUtil

ComminuteUtil主要处理分割的逻辑处理

通过输入流读取要分割的文件,分别从流中读取相应的字节数;

将其写到.tem的后缀文件中,分割的文件存放在源文件的对应目录下。

3、代码详解

ComminuteFrame类

package com.xiaoxuzhu;import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
/*** Description: 对大文件进行分割处理** @author xiaoxuzhu* @version 1.0** <pre>* 修改记录:* 修改后版本	        修改人		修改日期			修改内容* 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create* </pre>* @date 2022/5/3*/public class ComminuteFrame extends JFrame {/****/private static final long serialVersionUID = 2547743180459668116L;private JPanel contentPane;private JTextField sourceTextField;private JTextField sizeTextField;/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {@Overridepublic void run() {try {ComminuteFrame frame = new ComminuteFrame();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public ComminuteFrame() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 430, 211);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(null);setTitle("文件分割");JPanel panel = new JPanel();panel.setBounds(0, 0, 414, 181);contentPane.add(panel);panel.setLayout(null);JLabel messagelabel = new JLabel("源文件:");messagelabel.setBounds(47, 41, 54, 20);panel.add(messagelabel);sourceTextField = new JTextField();sourceTextField.setBounds(105, 41, 178, 21);panel.add(sourceTextField);sourceTextField.setColumns(10);JButton sourceButton = new JButton("选择");sourceButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {do_sourceButton_actionPerformed(arg0);}});sourceButton.setBounds(303, 40, 67, 23);panel.add(sourceButton);JLabel sizelabel = new JLabel("分割大小:");sizelabel.setBounds(34, 86, 67, 15);panel.add(sizelabel);sizeTextField = new JTextField();sizeTextField.setBounds(105, 83, 178, 21);panel.add(sizeTextField);sizeTextField.setColumns(10);sizeTextField.addKeyListener(new KeyAdapter() {@Overridepublic void keyTyped(KeyEvent event) { // 某键按下时调用的方法char ch = event.getKeyChar(); // 获取用户键入的字符if ((ch < '0' || ch > '9')) { // 如果用户输入的信息不为数字或小数event.consume(); // 不允许用户键入}}});JLabel lblM = new JLabel("M");lblM.setBounds(313, 86, 44, 15);panel.add(lblM);JButton cominButton = new JButton("分割");cominButton.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {do_cominButton_actionPerformed(arg0);}});cominButton.setBounds(101, 138, 93, 23);panel.add(cominButton);JButton close = new JButton("退出");close.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {do_close_actionPerformed(arg0);}});close.setBounds(229, 138, 93, 23);panel.add(close);}protected void do_sourceButton_actionPerformed(ActionEvent arg0) {java.awt.FileDialog fd = new FileDialog(this);fd.setVisible(true);String path = fd.getDirectory() + fd.getFile();if (!path.equals("") && !(path == null)) {sourceTextField.setText(path);}}protected void do_cominButton_actionPerformed(ActionEvent arg0) {ComminuteUtil util = new ComminuteUtil();String path = sourceTextField.getText();int size = Integer.parseInt(sizeTextField.getText());String subPath = path.substring(0, path.lastIndexOf("\\"));util.fenGe(new File(path), new File(subPath), size);JOptionPane.showMessageDialog(getContentPane(), "文件分割成功!", "信息提示框", JOptionPane.PLAIN_MESSAGE);}protected void do_close_actionPerformed(ActionEvent arg0) {System.exit(0);}
}

ComminuteUtil类

package com.xiaoxuzhu;
import java.io.*;/*** Description: ** @author xiaoxuzhu* @version 1.0** <pre>* 修改记录:* 修改后版本	        修改人		修改日期			修改内容* 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create* </pre>* @date 2022/5/3*/public class ComminuteUtil {// 实现文件分割方法public void fenGe(File commFile, File untieFile, int filesize) {FileInputStream fis = null;int size = 1024 * 1024; // 用来指定分割文件要以MB为单位try {if (!untieFile.isDirectory()) { // 如果要保存分割文件地址不是路径untieFile.mkdirs(); // 创建该路径}size = size * filesize;int length = (int) commFile.length(); // 获取文件大小int num = length / size; // 获取文件大小除以MB的得数int yu = length % size; // 获取文件大小与MB相除的余数String newfengeFile = commFile.getAbsolutePath(); // 获取保存文件的完成路径信息int fileNew = newfengeFile.lastIndexOf(".");String strNew = newfengeFile.substring(fileNew, newfengeFile.length()); // 截取字符串fis = new FileInputStream(commFile); // 创建FileInputStream类对象File[] fl = new File[num + 1]; // 创建文件数组int begin = 0;for (int i = 0; i < num; i++) { // 循环遍历数组fl[i] = new File(untieFile.getAbsolutePath() + "\\" + (i + 1) + strNew + ".tem"); // 指定分割后小文件的文件名if (!fl[i].isFile()) {fl[i].createNewFile(); // 创建该文件}FileOutputStream fos = new FileOutputStream(fl[i]);byte[] bl = new byte[size];fis.read(bl); // 读取分割后的小文件fos.write(bl); // 写文件begin = begin + size * 1024 * 1024;fos.close(); // 关闭流}if (yu != 0) { // 文件大小与指定文件分割大小相除的余数不为0fl[num] = new File(untieFile.getAbsolutePath() + "\\" + (num + 1) + strNew + ".tem"); // 指定文件分割后数组中最后一个文件名if (!fl[num].isFile()) {fl[num].createNewFile(); // 新建文件}FileOutputStream fyu = new FileOutputStream(fl[num]);byte[] byt = new byte[yu];fis.read(byt);fyu.write(byt);fyu.close();}} catch (Exception e) {e.printStackTrace();}}
}

分割前:

如图

分割后:

如图

三、题目描述-分割后又再次合并

1、题目

题目:分割后的文件要能再次正常使用,需要合并。

实现:做一个把分割后的文件又再次合并的工具

2、解题思路

创建一个类:UniteFrame

使用UniteFrame继承JFrame构建窗体

UniteFrame增加标签,文本框和分割按钮

创建一个类:UniteUtil

UniteUtil主要处理合并的逻辑处理

通过文件字节输入/输出流,把要合并的所有文件读取后,统一写入新文件中。

3、代码详解

UniteFrame类:

package com.xiaoxuzhu;
import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
/*** Description: ** @author xiaoxuzhu* @version 1.0** <pre>* 修改记录:* 修改后版本	        修改人		修改日期			修改内容* 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create* </pre>* @date 2022/5/3*/public class UniteFrame extends JFrame {/****/private JPanel contentPane;JList fileList = new JList();DefaultListModel listModel = new DefaultListModel();String folder = "";String fileName = "";List<String> listPath = new ArrayList<String>();/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {UniteFrame frame = new UniteFrame();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/*** Create the frame.*/public UniteFrame() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 425, 300);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));setContentPane(contentPane);contentPane.setLayout(null);setTitle("文件合并");JPanel panel = new JPanel();panel.setBounds(0, 0, 409, 262);contentPane.add(panel);panel.setLayout(null);JScrollPane scrollPane = new JScrollPane();scrollPane.setBounds(33, 51, 311, 151);panel.add(scrollPane);fileList.setModel(listModel);scrollPane.setViewportView(fileList);JLabel messagelabel = new JLabel("要进行合并的文件列表:");messagelabel.setBounds(33, 20, 156, 21);panel.add(messagelabel);JButton openButton = new JButton("打开");openButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {do_openButton_actionPerformed(arg0);}});openButton.setBounds(43, 218, 68, 23);panel.add(openButton);JButton uniteButton = new JButton("合并");uniteButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {do_uniteButton_actionPerformed(arg0);}});uniteButton.setBounds(152, 218, 68, 23);panel.add(uniteButton);JButton closeButton = new JButton("退出");closeButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {do_closeButton_actionPerformed(arg0);}});closeButton.setBounds(258, 218, 68, 23);panel.add(closeButton);}// 打开按钮的单击事件@SuppressWarnings("rawtypes")protected void do_openButton_actionPerformed(ActionEvent arg0) {java.awt.FileDialog fd = new FileDialog(this);fd.setVisible(true);folder = fd.getDirectory();String path = fd.getDirectory() + fd.getFile();fileName = fd.getFile();UniteUtil util = new UniteUtil();if (path.endsWith(".tem")) {List list = util.getList(folder);for (int i = 0; i < list.size(); i++) {String abPath = list.get(i).toString();if (abPath.endsWith(".tem")) {System.out.println("ABPAth " + abPath);listModel.addElement(abPath);listPath.add(abPath);}}}validate();}// 合并按钮的单击事件protected void do_uniteButton_actionPerformed(ActionEvent arg0) {UniteUtil util = new UniteUtil();String newName = fileName.substring(fileName.indexOf("."), fileName.lastIndexOf("."));File[] files = new File[listPath.size()];for (int i = 0; i < listPath.size(); i++) {files[i] = new File(listPath.get(i).toString());}util.unite(files, new File(folder), newName);JOptionPane.showMessageDialog(getContentPane(), "文件合并成功!", "信息提示框", JOptionPane.PLAIN_MESSAGE);}// 退出按钮的单击事件protected void do_closeButton_actionPerformed(ActionEvent arg0) {System.exit(0);}
}

UniteUtil类

package com.xiaoxuzhu;
import java.io.*;
import java.util.*;/*** Description: ** @author xiaoxuzhu* @version 1.0** <pre>* 修改记录:* 修改后版本	        修改人		修改日期			修改内容* 2022/5/3.1	    xiaoxuzhu		2022/5/3		    Create* </pre>* @date 2022/5/3*/public class UniteUtil {/*** @param file*            :要进行合并的文件数组对象* @param cunDir*            :合并后文件的保存路径* @param hz*            :合并后文件的格式*/public void unite(File[] file, File cunDir, String hz) {try {File heBingFile = new File(cunDir.getAbsoluteFile() + "\\UNTIE" + hz); // 指定分割后文件的文件名if (!heBingFile.isFile()) {heBingFile.createNewFile();}FileOutputStream fos = new FileOutputStream(heBingFile); // 创建FileOutputStream对象for (int i = 0; i < file.length; i++) { // 循环遍历要进行合并的文件数组对象FileInputStream fis = new FileInputStream(file[i]);int len = (int) file[i].length(); // 获取文件长度byte[] bRead = new byte[len];fis.read(bRead); // 读取文件fos.write(bRead); // 写入文件fis.close(); // 将流关闭}fos.close();} catch (Exception e) {e.printStackTrace();}}// 获取磁盘所有文件方法public List<String> getList(String path) {LinkedList<File> list = new LinkedList<File>();ArrayList<String> listPath = new ArrayList<String>();File dir = new File(path);File file[] = dir.listFiles();for (int i = 0; i < file.length; i++) {if (file[i].isDirectory())list.add(file[i]);else {listPath.add(file[i].getAbsolutePath());}}File tmp;while (!list.isEmpty()) {tmp = list.removeFirst(); // 移除并返回集合中第一项if (tmp.isDirectory()) {file = tmp.listFiles();if (file == null)continue;for (int i = 0; i < file.length; i++) {if (file[i].isDirectory())list.add(file[i]);else {listPath.add(file[i].getAbsolutePath());}}} else {}}return listPath;}}

如图

合并成功:

如图

4、多学一个知识点

新合并的文件,是怎么知道后缀文件名是哪个

这个在进行分割处理时就有考虑设计了,切割的文件名是以1.zip.tem,前面的是切割排序号,中间的是源文件的文件类型后缀,最后是切割文件后缀。

String newName = fileName.substring(fileName.indexOf("."), fileName.lastIndexOf("."));

四、推荐专栏

《JAVA从零到壹》

《JAVA从零到壹》第八讲:系统常用类

《Hutool实战》7hutool实战:FileUtil 文件工具类(100多个文件常用操作方法)

五、示例源码下载

关注下面的公众号,回复筑基+题目号

筑基55

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

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

相关文章

安装CUDA wget下载速度慢解决办法(天下无敌)

因为墙的原因&#xff0c;再加上英伟达工作人员脑筋不会急转弯&#xff0c;以及wget是个弟中弟&#xff0c;下载cuda时可能会很慢、断线&#xff0c;翻墙又不方便。 但是没关系&#xff0c;谈笑间&#xff0c;让我们用一分钟成交它 以ubuntu18.04系统&#xff0c;RTX2060显卡&…

玩游戏用什么耳机好

如果你计划主要使用耳机进行游戏&#xff0c;流媒体和语音聊天&#xff0c;那么您应该购买一款专为此而设的游戏耳机。如果您喜欢高品质的音乐&#xff0c;那么您花在游戏耳机上的钱&#xff0c;可以获得一对音质更好但通常没有麦克风&#xff0c;专用软件和类似功能的耳机。并…

cf 845C

原题链接 题意 思路 1.这道题还是很好想到贪心的&#xff0c;题中看到左右两个端点&#xff0c;可以想到贪心的区间覆盖问题&#xff0c;这道题只是在这个基础变成了两个区域&#xff0c;但实际难度反而减小了 2.我们先将所有的区间按照左端点排序&#xff0c;然后进行遍历&…

开放式耳机什么意思,介绍几款不错的开放式耳机

开放式耳机是一种新型的耳机&#xff0c;相比于传统的耳机&#xff0c;开放式耳机听歌时不需要将耳朵堵上&#xff0c;不会因为长时间佩戴而对听力造成损害。它不需要入耳也能听到声音&#xff0c;在户外运动时能够及时听到环境音&#xff0c;避免安全隐患。现在在骨传导市面上…

有什么专业打游戏的蓝牙耳机?四款电竞蓝牙耳机推荐

蓝牙耳机的口碑足够好的话&#xff0c;绝对会传遍整个数码界。像今天我介绍的这几款蓝牙耳机&#xff0c;在数码圈就是口碑被吹爆的存在&#xff0c;兼具平价和高性能的优点&#xff0c;音质非常不错&#xff0c;所以很值得专门写一篇推文来进行推荐&#xff0c;放心吧&#xf…

cf 845 B

原题链接 题意 思路 1.一开始做的想法是错误的&#xff0c;然后wa了好几次&#xff0c;最后看样例才ac了 2.我们知道&#xff0c;最多也就操作3次&#xff0c;每次操作的最大程度只能是将 这个数变为9或者0&#xff0c;这样才能是我们的结果最优化 3.分情况&#xff0c;假设前三…

打游戏的蓝牙耳机推荐哪一款?英雄联盟电竞耳机推荐

现如今的生活节奏越来越快&#xff0c;人们的压力越来越&#xff0c;工作余后的时光该怎么调节心情呢&#xff1f;听听音乐是个不错的选择。比较低传统的耳机线收起来总是缠缠绕绕的&#xff0c;使用起来不方便&#xff0c;近年来出的真无线蓝牙耳机市场也是非常火爆&#xff0…

竞技游戏耳机哪种好?竞技游戏专用蓝牙耳机推荐

作为一名游戏爱好者&#xff0c;平常在打游戏的时候身边一定会有游戏外设&#xff0c;游戏外设可以辅助我在游戏中有着更佳的体验&#xff1b;经常陪伴我的游戏外设就是蓝牙耳机了&#xff0c;平常我也不喜欢戴有线的耳机&#xff0c;对于我来说无线耳机是最方便的&#xff0c;…

开放式耳机值得买吗?索尼、南卡、cleer、飞利浦开放式耳机推荐

当然值得买了&#xff01;传统入耳式耳机戴久了容易出现不适感&#xff0c;而开放式耳机则不会&#xff0c;不入耳设计&#xff0c;更好佩戴&#xff0c;更舒适体验。开放式耳机还可以让你听到更多的细节和深度&#xff0c;是众多音乐爱好者和运动人士的理想选择。我整理了几款…

006如何提高WIN7下的麦克风音量?

如何提高WIN7下的麦克风音量&#xff1f; 由于要在电脑上面录制视频&#xff0c;当然包括语音&#xff0c;所以淘宝了2个带麦克风的耳机&#xff0c;还有一个话筒&#xff1a; https://item.taobao.com/item.htm?spma1z09.2.0.0.4e912e8dUqGkm7&id574895088480&_utju…

Python自动化小技巧21——实现PDF转word功能(程序制作)

案例背景 为什么这个年代PDF转word&#xff0c;某wps居然还要收费.....很多软件都可以实现这个功能&#xff0c;但是效果都有好有坏&#xff0c;而且有的还付费&#xff0c;很麻烦。 那就用python实现这个功能吧&#xff0c;然后把代码打包为.exe的程序&#xff0c;这样随便在…

Lazada上五大热门品类,销售趋势有什么变化?

现在很多想要做跨境的卖家都纷纷看中了东南亚的市场。而现在的销售模式就是通过线上销售的方式,因此可以说各大东南亚销售平台就成为炙手可热的产品之一。在众多的平台之中,其中Lazada是相当受欢迎的,在过去疫情三年的时间内,销售反而出现了增加的趋势。那么我们来看看Lazada上…

【verge3D】为web3D开启陀螺仪功能

我想要实现在v3d中通过陀螺仪控制相机的方向&#xff0c;在v3d的示例中&#xff0c;我找到了misc_controls_deviceorientation.html&#xff0c;这是官方实现这个功能的示例。示例在SDK中&#xff0c;由于v3d是基于three.js的&#xff0c;在three.js官网的示例中有对应的演示&a…

HTML5地球Web3D可视化(WebGL Three.js)

接触WebGL也有五六年了&#xff0c;今天闲着没事&#xff0c;就整理了下过去写的有关地球数据可视化的案例&#xff0c;算是对WebGL的宣传推广吧。 视频查看Web3D效果 B站地址&#xff1a;https://www.bilibili.com/video/BV1qA411H7Xs 在HTML4的时代&#xff0c;如果想在We…

WEB 3D

WEB3D又称虚拟三维&#xff0c;是一种在 虚拟现实技术的基础上&#xff0c;利用3D互联网平台将现实世界中有形的物品通过互联网进行虚拟的三维立体展示并可互动浏览操作的一种虚拟现实技术。相比起目前网上主流的以图片、FLASH、 三维动画的展示方式来说&#xff0c;WEB3D技术让…

Three 之 three.js (webgl)基础 第一个入门 Web 3D 场景

Three 之 three.js &#xff08;webgl&#xff09;基础 第一个入门 Web 3D 场景 目录 Three 之 three.js &#xff08;webgl&#xff09;基础 第一个入门 Web 3D 场景 一、简单介绍 二、Three 中构建场景主要的三要素 三、场景&#xff08;Scene&#xff09; 四、摄像机&a…

Web3D水厂:数字孪生智慧水务三维WebGL可视化管理系统

建设背景 伴随着城市的发展趋势&#xff0c;各水司供水半经扩张&#xff0c;管网更为繁杂&#xff0c;成本和操作难度系数大幅度提高。安全性&#xff0c;高品质&#xff0c;高效率供水服务项目的急切要求和阶梯水价政策的执行&#xff0c;对水司经营明确提出了高规定。智慧水…

Web3D展示框架whs.js:基于Three.js的Web3d应用程序的超快3D框架

whs.js介绍: whs.js是一个在Three.js基础上构建的Web3D应用框架&#xff0c;它实现了一个具有组件系统和插件支持的核心&#xff0c;可以快速开发出web3D场景。 Web3D展示框架whs.js&#xff1a;基于 Three.js的Web应用程序的超快 web3D框架 whs.js如何获取 whs是开源项目&am…

WEB 3D JS 使用【3Dmol.js】

在web使用3d查看器&#xff0c;很多时候我们会优先考虑是不是要用wegGL又或者Three.js 这里分享一个在生物和化学上比较简单的分子3D查看器 3Dmol.js 先看下这句话&#xff1a; 3D view 查看器 default pdb; can be pdb, sdf, xyz, mol2, or cube 如果不是以上的格式&#…

Web3D重构(VueWebApi)总结

1、 不保存预设 注意&#xff1a;创建时选取VUE3.0版本 2、VUE中只针对某个属性做translate动画&#xff0c;那么要在translate加上该属性&#xff0c;否则就所有属性都会动画&#xff1a; 3、VUE中export与import 3、某个元素集合的第一个元素 5、要安装淘宝的cnpm镜像&#…