重庆传智播客吧 关注:15贴子:75
  • 0回复贴,共1

JAVA操作HDFS工具类

只看楼主收藏回复

一、HDFSUtil工具类补充删除文件 /** * 删除某一路径 * @param path 需要删除的路径 * @param recursive 指定为true删除目录中全部文件,false时可以删除空目录和单个文件 * @Return */ public boolean delete(String path, boolean recursive) { boolean result = false; if(recursive) { try { result = fs.delete(new Path(path), true); } catch (Exception e) { e.printStackTrace(); result = false; } return result; }else{ try { result = fs.delete(new Path(path), false); } catch (Exception e) { e.printStackTrace(); result = false; } return result; } }获取某一路径下的文件信息/** * 获得某一路径下的文件信息 * @param path 待查看路径 * @return 文件信息列表-包含文件类型,文件大小,所有者,所在组,文件名称 */ public List<String> getFileInfo(String path){ List<String> infos = new ArrayList<>(); try { // 通过FileSystem获得某一路径下的文件状态列表 FileStatus[] fileStatus = fs.listStatus(new Path(path)); for (FileStatus temp : fileStatus) { String info = ""; // 判断文件类型 if (temp.isDirectory()) { info += "目录\t" + "0" + "\t"; }else { info += "文件\t" + sizeFormat(temp.getLen()) + "\t"; } // 拼接文件信息 info += temp.getOwner() + "\t" + temp.getGroup() + "\t" + temp.getPath().getName(); infos.add(info); } } catch (Exception e) { e.printStackTrace(); } return infos; }文件大小单位换算/** * 文件大小单位换算 * @param length 默认获得的文件大小单位为Byte-字节 * @return 使用1024进行换算 */ private String sizeFormat(long length) { long result = length; // 不足1024则单位为Byte if (result / 1024 == 0) { return result + "B"; }else { result /= 1024; // 不足1024*1024则单位为KB,否则为MB if (result / 1024 == 0) { return result + "KB"; }else { return result / 1024 + "MB"; } } }将本地文件内容写入HDFS文件中create():覆盖原文件append():直接在原文件基础上进行追加/** * 将本地磁盘文件内容写入HDFS文件中 * @param src 源文件路径 * @param parentDir 目标文件父级目录 * @param fileName 目标文件名称 * @param overwrite 是否覆盖写入 * @return */ public boolean write(String src,String parentDir,String fileName,boolean overwrite) { // 判断源文件是否存在,如不存在则直接返回 if (!new File(src).exists()) { System.out.println("源文件不存在"); return false; } FSDataOutputStream fsDataOutputStream = null; boolean isDir = false; try { // 由于HDFS的特殊性,必须保证父级路径是一个目录,而不能只判断是否存在 isDir = fs.isDirectory(new Path(parentDir)); } catch (Exception e) { e.printStackTrace(); } if (!isDir) {// false -> 可能为文件也可能不存在 try { // 尝试创建父级目录 fs.mkdirs(new Path(parentDir)); } catch (Exception e) { // 出现异常说明该路径下已经存在了文件 - 与目标文件夹文件相同 e.printStackTrace(); System.out.println("该路径不可用"); return false; } } Path destPath = new Path(parentDir + File.separator + fileName); if (overwrite) { try { // 覆盖写入时使用create方法进行创建,指定覆盖参数为true fsDataOutputStream = fs.create(destPath,true); } catch (Exception e) { e.printStackTrace(); } }else { try { // 保证文件一定存在,如果已经存在返回false,不会重新创建 fs.createNewFile(destPath); // 追加写入时使用append方法进行创建 fsDataOutputStream = fs.append(destPath); } catch (Exception e) { e.printStackTrace(); } } // 初始化输入流,指定编码 BufferedReader bufferedReader = null; Writer writer = null; try { bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(src)), "UTF-8")); writer = new OutputStreamWriter(fsDataOutputStream, "UTF-8"); } catch (Exception e) { e.printStackTrace(); } BufferedWriter bufferedWriter = new BufferedWriter(writer); String temp = ""; int line = 0; try { while((temp = bufferedReader.readLine()) != null) { bufferedWriter.write(temp); bufferedWriter.newLine(); line ++; // 每一千行写入一次数据 if (line % 1000 == 0) { bufferedWriter.flush(); } } } catch (IOException e) { e.printStackTrace(); return false; } try { bufferedWriter.flush(); bufferedWriter.close(); writer.close(); bufferedReader.close(); fsDataOutputStream.close(); } catch (IOException e) { e.printStackTrace(); return false; } return true; }读取HDFS中的文件内容/** * 从指定文件中读取数据 * @param path HDFS路径 */ public void read(String path) { try { // 使用open方法获得一个输入流 FSDataInputStream fsDataInputStream = fs.open(new Path(path)); // 使用缓冲流读取文件内容 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fsDataInputStream, "UTF-8")); String temp = ""; while ((temp = bufferedReader.readLine()) != null) { System.out.println(temp); } bufferedReader.close(); fsDataInputStream.close(); } catch (Exception e) { e.printStackTrace(); } }二、PropertiesUtil工具类此工具类作用是获取properties中的配置import java.io.IOException;import java.util.Properties;public class PropertiesUtil { private String fileName; private Properties properties = new Properties(); public PropertiesUtil(String fileName) { this.fileName = fileName; open(); } private void open() { try { properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)); } catch (IOException e) { e.printStackTrace(); } } public String readPropertyByKey(String key) { return properties.getProperty(key); }}


1楼2018-09-14 09:10回复