`
i2534
  • 浏览: 182850 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

简易的mp3分拣程序

    博客分类:
  • util
阅读更多

硬盘内的mp3文件太多了,下的时候没有归类,结果比较乱,就自己写了个小程序分拣.上代码:

 

程序运行图

 

会将文件按照这两种格式放置在选定的目录中

 

主程序

 

package com.javaeye.i2534;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileFilter;
import javax.swing.filechooser.FileSystemView;

/**
 * 
 * @author lan
 * 
 */
public class MP3Manager extends JFrame {

	private static final long	serialVersionUID	= 1L;
	private JPanel				jContentPane		= null;
	private JPanel				jPanel				= null;
	private JLabel				pathLabel			= null;
	private JTextField			pathTextField		= null;
	private JButton				browseButton		= null;
	private JScrollPane			jScrollPane			= null;
	private JPanel				jPanel1				= null;
	private JList				fileList			= null;
	private JLabel				nameLabel			= null;
	private JLabel				artistLabel			= null;
	private JLabel				albumLabel			= null;
	private JLabel				yearLabel			= null;
	private JLabel				commentLabel		= null;
	private JTextField			nameTextField		= null;
	private JTextField			artistTextField		= null;
	private JTextField			albumTextField		= null;
	private JTextField			yearTextField		= null;
	private JTextArea			commentTextArea		= null;
	private JMenuBar			mainMenuBar			= null;
	private JMenu				fileMenu			= null;
	private JMenuItem			exitMenuItem		= null;
	private JMenuItem			groupMenuItem		= null;

	/**
	 * This is the default constructor
	 */
	public MP3Manager() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setJMenuBar(getMainMenuBar());
		this.setSize(560, 415);
		this.add(getJContentPane(), BorderLayout.CENTER);
		this.setTitle("MP3管理工具");
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJPanel(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jPanel
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			pathLabel = new JLabel();
			pathLabel.setBounds(new Rectangle(36, 21, 54, 24));
			pathLabel.setHorizontalAlignment(SwingConstants.RIGHT);
			pathLabel.setText("文件夹");
			jPanel = new JPanel();
			jPanel.setLayout(null);
			jPanel.add(pathLabel, null);
			jPanel.add(getPathTextField(), null);
			jPanel.add(getBrowseButton(), null);
			jPanel.add(getJScrollPane(), null);
			jPanel.add(getJPanel1(), null);
		}
		return jPanel;
	}

	/**
	 * This method initializes pathTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getPathTextField() {
		if (pathTextField == null) {
			pathTextField = new JTextField();
			pathTextField.setBounds(new Rectangle(112, 20, 311, 26));
		}
		return pathTextField;
	}

	/**
	 * This method initializes browseButton
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getBrowseButton() {
		if (browseButton == null) {
			browseButton = new JButton();
			browseButton.setBounds(new Rectangle(438, 21, 62, 22));
			browseButton.setText("浏览");
			browseButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					JFileChooser chooser = new JFileChooser(FileSystemView
							.getFileSystemView());
					chooser
							.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
					chooser.addChoosableFileFilter(new FileFilter() {

						@Override
						public boolean accept(File f) {
							if (f.isDirectory()) {
								return true;
							} else if (f.isFile()) {
								return f.getName().toLowerCase()
										.endsWith(".mp3");
							}
							return false;
						}

						@Override
						public String getDescription() {
							return "MP3 (.mp3)";
						}

					});
					if (chooser.showOpenDialog(MP3Manager.this) == JFileChooser.APPROVE_OPTION) {
						File dir = chooser.getSelectedFile();
						getPathTextField().setText(dir.getAbsolutePath());
						Set<File> set = new HashSet<File>();
						MP3Util.walk(dir, set);
						DefaultListModel model = (DefaultListModel) getFileList()
								.getModel();
						model.clear();
						List<FileWrapper> warppers = new ArrayList<FileWrapper>();
						for (File f : set) {
							warppers.add(new FileWrapper(f));
						}
						Collections.sort(warppers);
						for (FileWrapper f : warppers) {
							model.addElement(f);
						}
					}
				}
			});
		}
		return browseButton;
	}

	/**
	 * file包装器,方便list显示
	 * 
	 * @author lan
	 * 
	 */
	private class FileWrapper implements Comparable<FileWrapper> {
		File	file;

		public FileWrapper(File file) {
			this.file = file;
		}

		@Override
		public String toString() {
			return file.getName();
		}

		public int compareTo(FileWrapper o) {
			if (o == null) {
				return -1;
			}
			return this.file.getName().compareTo(o.file.getName());
		}
	}

	/**
	 * This method initializes jScrollPane
	 * 
	 * @return javax.swing.JScrollPane
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setBounds(new Rectangle(23, 75, 197, 265));
			jScrollPane.setViewportView(getFileList());
			jScrollPane
					.setBorder(BorderFactory
							.createTitledBorder(null, "MP3\u5217\u8868", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font(
									"Dialog", Font.BOLD, 12), new Color(51, 51,
									51)));
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jPanel1
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			commentLabel = new JLabel();
			commentLabel.setBounds(new Rectangle(25, 190, 50, 20));
			commentLabel.setText("信息");
			yearLabel = new JLabel();
			yearLabel.setBounds(new Rectangle(25, 150, 50, 20));
			yearLabel.setText("年代");
			albumLabel = new JLabel();
			albumLabel.setBounds(new Rectangle(25, 110, 50, 20));
			albumLabel.setText("专辑");
			artistLabel = new JLabel();
			artistLabel.setBounds(new Rectangle(25, 70, 50, 20));
			artistLabel.setText("演唱");
			nameLabel = new JLabel();
			nameLabel.setBounds(new Rectangle(25, 30, 50, 20));
			nameLabel.setText("名称");
			jPanel1 = new JPanel();
			jPanel1.setLayout(null);
			jPanel1.setBounds(new Rectangle(257, 75, 256, 264));
			jPanel1
					.setBorder(BorderFactory
							.createTitledBorder(null, "MP3\u4fe1\u606f", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font(
									"Dialog", Font.BOLD, 12), new Color(51, 51,
									51)));
			jPanel1.add(nameLabel, null);
			jPanel1.add(artistLabel, null);
			jPanel1.add(albumLabel, null);
			jPanel1.add(yearLabel, null);
			jPanel1.add(commentLabel, null);
			jPanel1.add(getNameTextField(), null);
			jPanel1.add(getArtistTextField(), null);
			jPanel1.add(getAlbumTextField(), null);
			jPanel1.add(getYearTextField(), null);
			jPanel1.add(getCommentTextArea(), null);
		}
		return jPanel1;
	}

	/**
	 * This method initializes fileList
	 * 
	 * @return javax.swing.JList
	 */
	private JList getFileList() {
		if (fileList == null) {
			fileList = new JList(new DefaultListModel());
			fileList
					.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
						public void valueChanged(
								javax.swing.event.ListSelectionEvent e) {
							if (e.getValueIsAdjusting()) {
								Object o = fileList.getSelectedValue();
								if (o instanceof FileWrapper) {
									File f = ((FileWrapper) o).file;
									MP3Info info = MP3Util.getInfo(f);
									getNameTextField().setText(info.getName());
									getArtistTextField().setText(info
											.getArtist());
									getAlbumTextField()
											.setText(info.getAlbum());
									getYearTextField().setText(info.getYear());
									getCommentTextArea().setText(info
											.getComment());
								}
							}
						}
					});
		}
		return fileList;
	}

	/**
	 * This method initializes nameTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getNameTextField() {
		if (nameTextField == null) {
			nameTextField = new JTextField();
			nameTextField.setBounds(new Rectangle(95, 30, 130, 20));
			nameTextField.setEditable(false);
		}
		return nameTextField;
	}

	/**
	 * This method initializes artistTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getArtistTextField() {
		if (artistTextField == null) {
			artistTextField = new JTextField();
			artistTextField.setBounds(new Rectangle(95, 70, 130, 20));
			artistTextField.setEditable(false);
		}
		return artistTextField;
	}

	/**
	 * This method initializes albumTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getAlbumTextField() {
		if (albumTextField == null) {
			albumTextField = new JTextField();
			albumTextField.setBounds(new Rectangle(95, 110, 130, 20));
			albumTextField.setEditable(false);
		}
		return albumTextField;
	}

	/**
	 * This method initializes yearTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private JTextField getYearTextField() {
		if (yearTextField == null) {
			yearTextField = new JTextField();
			yearTextField.setBounds(new Rectangle(95, 150, 130, 20));
			yearTextField.setEditable(false);
		}
		return yearTextField;
	}

	/**
	 * This method initializes commentTextArea
	 * 
	 * @return javax.swing.JTextArea
	 */
	private JTextArea getCommentTextArea() {
		if (commentTextArea == null) {
			commentTextArea = new JTextArea();
			commentTextArea.setBounds(new Rectangle(95, 190, 130, 60));
			commentTextArea.setEditable(false);
			commentTextArea.setEnabled(true);
			commentTextArea.setLineWrap(true);
		}
		return commentTextArea;
	}

	/**
	 * This method initializes mainMenuBar
	 * 
	 * @return javax.swing.JMenuBar
	 */
	private JMenuBar getMainMenuBar() {
		if (mainMenuBar == null) {
			mainMenuBar = new JMenuBar();
			mainMenuBar.add(getFileMenu());
		}
		return mainMenuBar;
	}

	/**
	 * This method initializes fileMenu
	 * 
	 * @return javax.swing.JMenu
	 */
	private JMenu getFileMenu() {
		if (fileMenu == null) {
			fileMenu = new JMenu();
			fileMenu.setPreferredSize(new Dimension(50, 20));
			fileMenu.setText("文件");
			fileMenu.setBounds(new Rectangle(0, 0, 50, 20));
			fileMenu.add(getGroupMenuItem());
			fileMenu.add(getExitMenuItem());
		}
		return fileMenu;
	}

	/**
	 * This method initializes exitMenuItem
	 * 
	 * @return javax.swing.JMenuItem
	 */
	private JMenuItem getExitMenuItem() {
		if (exitMenuItem == null) {
			exitMenuItem = new JMenuItem();
			exitMenuItem.setText("退出");
			exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					System.exit(0);
				}
			});
		}
		return exitMenuItem;
	}

	/**
	 * This method initializes groupMenuItem
	 * 
	 * @return javax.swing.JMenuItem
	 */
	private JMenuItem getGroupMenuItem() {
		if (groupMenuItem == null) {
			groupMenuItem = new JMenuItem();
			groupMenuItem.setText("分组");
			groupMenuItem
					.addActionListener(new java.awt.event.ActionListener() {
						public void actionPerformed(java.awt.event.ActionEvent e) {
							String text = getPathTextField().getText();
							File dir = new File(text);
							if (dir.exists() && dir.isDirectory()) {
								MP3GroupDialog sd = new MP3GroupDialog(
										MP3Manager.this);
								sd.setPath(dir);
								sd.setVisible(true);
							}
						}
					});
		}
		return groupMenuItem;
	}

	public static void main(String[] args) {
		MP3Manager m = new MP3Manager();
		m.setLocationRelativeTo(null);
		m.setVisible(true);
	}

} // @jve:decl-index=0:visual-constraint="10,10"

 

MP3的info类

 

package com.javaeye.i2534;

import java.nio.charset.Charset;
import java.util.Arrays;

/**
 * mp3信息,遵循ID3v1格式
 * 
 * @author lan
 * 
 */
public class MP3Info {

	private final Charset	GBK	= Charset.forName("GBK");
	// 应该是128位
	private byte[]			tag;

	public MP3Info(byte[] tag) throws IllegalArgumentException {
		this.tag = tag;
		if (this.tag.length != 128) {
			throw new IllegalArgumentException();
		}
		if (!isValid()) {
			throw new IllegalArgumentException();
		}
	}

	/**
	 * 是否包含TAG标签,如果没有,就是不合法的信息,不能读取
	 * 
	 * @return
	 */
	private boolean isValid() {
		byte[] array = Arrays.copyOfRange(this.tag, 0, 3);
		String s = new String(array, GBK);
		return "TAG".equals(s);
	}

	/**
	 * 艺术家
	 * 
	 * @return
	 */
	public String getArtist() {
		return getString(33, 63);
	}

	/**
	 * 专辑
	 * 
	 * @return
	 */
	public String getAlbum() {
		return getString(63, 93);
	}

	/**
	 * 音乐名称
	 * 
	 * @return
	 */
	public String getName() {
		return getString(3, 33);
	}

	/**
	 * 年代
	 * 
	 * @return
	 */
	public String getYear() {
		return getString(93, 97);
	}

	/**
	 * 备注信息
	 * 
	 * @return
	 */
	public String getComment() {
		return getString(97, 125);
	}

	/**
	 * 流派
	 */
	public String getCenre() {
		return getString(127, 128);
	}

	/**
	 * 获取tag中指定范围内的字符串
	 * 
	 * @param from
	 * @param to
	 * @return
	 */
	private String getString(int from, int to) {
		byte[] array = Arrays.copyOfRange(this.tag, from, to);
		int length = 0;
		for (byte b : array) {
			if (b != 0) {
				length++;
			} else {
				break;
			}
		}
		return new String(array, 0, length, GBK);
	}

	/*
	 * ID3 GENRES LIST
	 * 
	 * 0 - Blues
	 * 
	 * 1 - Classic Rock
	 * 
	 * 2 - Country
	 * 
	 * 3 - Dance
	 * 
	 * 4 - Disco
	 * 
	 * 5 - Funk
	 * 
	 * 6 - Grunge
	 * 
	 * 7 - Hip-Hop
	 * 
	 * 8 - Jazz
	 * 
	 * 9 - Metal
	 * 
	 * 10 - New Age
	 * 
	 * 11 - Oldies
	 * 
	 * 12 - Other
	 * 
	 * 13 - Pop
	 * 
	 * 14 - R&B
	 * 
	 * 15 - Rap
	 * 
	 * 16 - Reggae
	 * 
	 * 17 - Rock
	 * 
	 * 18 - Techno
	 * 
	 * 19 - Industrial
	 * 
	 * 20 - Alternative
	 * 
	 * 21 - Ska
	 * 
	 * 22 - Death Metal
	 * 
	 * 23 - Pranks
	 * 
	 * 24 - Soundtrack
	 * 
	 * 25 - Euro-Techno
	 * 
	 * 26 - Ambient
	 * 
	 * 27 - Trip-Hop
	 * 
	 * 28 - Vocal
	 * 
	 * 29 - Jazz+Funk
	 * 
	 * 30 - Fusion
	 * 
	 * 31 - Trance
	 * 
	 * 32 - Classical
	 * 
	 * 33 - Instrumental
	 * 
	 * 34 - Acid
	 * 
	 * 35 - House
	 * 
	 * 36 - Game
	 * 
	 * 37 - Sound Clip
	 * 
	 * 38 - Gospel
	 * 
	 * 39 - Noise
	 * 
	 * 40 - Alternative Rock
	 * 
	 * 41 - Bass
	 * 
	 * 42 - Soul
	 * 
	 * 43 - Punk
	 * 
	 * 44 - Space
	 * 
	 * 45 - Meditative
	 * 
	 * 46 - Instrumental Pop
	 * 
	 * 47 - Instrumental Rock
	 * 
	 * 48 - Ethnic
	 * 
	 * 49 - Gothic
	 * 
	 * 50 - Darkwave
	 * 
	 * 51 - Techno-Industrial
	 * 
	 * 52 - Electronic
	 * 
	 * 53 - Pop-Folk
	 * 
	 * 54 - Eurodance
	 * 
	 * 55 - Dream
	 * 
	 * 56 - Southern Rock
	 * 
	 * 57 - Comedy
	 * 
	 * 58 - Cult
	 * 
	 * 59 - Gangsta
	 * 
	 * 60 - Top 40
	 * 
	 * 61 - Christian Rap
	 * 
	 * 62 - Pop/Funk
	 * 
	 * 63 - Jungle
	 * 
	 * 64 - Native US
	 * 
	 * 65 - Cabaret
	 * 
	 * 66 - New Wave
	 * 
	 * 67 - Psychadelic
	 * 
	 * 68 - Rave
	 * 
	 * 69 - Showtunes
	 * 
	 * 70 - Trailer
	 * 
	 * 71 - Lo-Fi
	 * 
	 * 72 - Tribal
	 * 
	 * 73 - Acid Punk
	 * 
	 * 74 - Acid Jazz
	 * 
	 * 75 - Polka
	 * 
	 * 76 - Retro
	 * 
	 * 77 - Musical
	 * 
	 * 78 - Rock & Roll
	 * 
	 * 79 - Hard Rock
	 * 
	 * 80 - Folk
	 * 
	 * 81 - Folk-Rock
	 * 
	 * 82 - National Folk
	 * 
	 * 83 - Swing
	 * 
	 * 84 - Fast Fusion
	 * 
	 * 85 - Bebob
	 * 
	 * 86 - Latin
	 * 
	 * 87 - Revival
	 * 
	 * 88 - Celtic
	 * 
	 * 89 - Bluegrass
	 * 
	 * 90 - Avantgarde
	 * 
	 * 91 - Gothic Rock
	 * 
	 * 92 - Progressive Rock
	 * 
	 * 93 - Psychedelic Rock
	 * 
	 * 94 - Symphonic Rock
	 * 
	 * 95 - Slow Rock
	 * 
	 * 96 - Big Band
	 * 
	 * 97 - Chorus
	 * 
	 * 98 - Easy Listening
	 * 
	 * 99 - Acoustic
	 * 
	 * 100 - Humour
	 * 
	 * 101 - Speech
	 * 
	 * 102 - Chanson
	 * 
	 * 103 - Opera
	 * 
	 * 104 - Chamber Music
	 * 
	 * 105 - Sonata
	 * 
	 * 106 - Symphony
	 * 
	 * 107 - Booty Bass
	 * 
	 * 108 - Primus
	 * 
	 * 109 - Porn Groove
	 * 
	 * 110 - Satire
	 * 
	 * 111 - Slow Jam
	 * 
	 * 112 - Club
	 * 
	 * 113 - Tango
	 * 
	 * 114 - Samba
	 * 
	 * 115 - Folklore
	 * 
	 * 116 - Ballad
	 * 
	 * 117 - Power Ballad
	 * 
	 * 118 - Rhythmic Soul
	 * 
	 * 119 - Freestyle
	 * 
	 * 120 - Duet
	 * 
	 * 121 - Punk Rock
	 * 
	 * 122 - Drum Solo
	 * 
	 * 123 - Acapella
	 * 
	 * 124 - Euro-House
	 * 
	 * 125 - Dance Hall
	 * 
	 * 126 - Goa
	 * 
	 * 127 - Drum & Bass
	 * 
	 * 128 - Club - House
	 * 
	 * 129 - Hardcore
	 * 
	 * 130 - Terror
	 * 
	 * 131 - Indie
	 * 
	 * 132 - BritPop
	 * 
	 * 133 - Negerpunk
	 * 
	 * 134 - Polsk Punk
	 * 
	 * 135 - Beat
	 * 
	 * 136 - Christian Gangsta Rap
	 * 
	 * 137 - Heavy Metal
	 * 
	 * 138 - Black Metal
	 * 
	 * 139 - Crossover
	 * 
	 * 140 - Contemporary Christian
	 * 
	 * 141 - Christian Rock
	 * 
	 * 142 - Merengue
	 * 
	 * 143 - Salsa
	 * 
	 * 144 - Thrash Metal
	 * 
	 * 145 - Anime
	 * 
	 * 146 - JPop
	 * 
	 * 147 - Synthpop
	 * 
	 * 148 and further - Unknown
	 * 
	 * 255 Unknown
	 */
}

 

 

mp3分组的dialog类

 

package com.javaeye.i2534;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Rectangle;
import java.io.File;
import java.util.HashSet;
import java.util.Set;

import javax.swing.ButtonGroup;
import javax.swing.ButtonModel;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

/**
 * 
 * @author lan
 *
 */
public class MP3GroupDialog extends JDialog {

	private static final long	serialVersionUID	= 1L;
	private JPanel				jContentPane		= null;
	private JPanel				jPanel				= null;
	private JRadioButton		jRadioButton		= null;
	private JRadioButton		jRadioButton1		= null;
	private JButton				jButton				= null;
	private JButton				jButton1			= null;
	private ButtonGroup			buttonGroup			= null;
	private File				path				= null; //@jve:decl-index=0:

	/**
	 * @param owner
	 */
	public MP3GroupDialog(Frame owner) {
		super(owner);
		initialize();
		this.setLocationRelativeTo(owner);
	}

	public void setPath(File path) {
		this.path = path;
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(262, 246);
		this.setTitle("选择分组");
		this.setContentPane(getJContentPane());
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJPanel(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jPanel
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(null);
			jPanel.add(getJRadioButton(), null);
			jPanel.add(getJRadioButton1(), null);
			jPanel.add(getJButton(), null);
			jPanel.add(getJButton1(), null);
		}
		return jPanel;
	}

	/**
	 * This method initializes jRadioButton
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getJRadioButton() {
		if (jRadioButton == null) {
			jRadioButton = new JRadioButton();
			jRadioButton.setBounds(new Rectangle(50, 36, 141, 21));
			jRadioButton.setText("歌手-专辑-歌曲");
			jRadioButton.setActionCommand("aas");
			getButtonGroup().add(jRadioButton);
		}
		return jRadioButton;
	}

	/**
	 * This method initializes jRadioButton1
	 * 
	 * @return javax.swing.JRadioButton
	 */
	private JRadioButton getJRadioButton1() {
		if (jRadioButton1 == null) {
			jRadioButton1 = new JRadioButton();
			jRadioButton1.setBounds(new Rectangle(50, 80, 133, 21));
			jRadioButton1.setText("歌手-歌曲");
			jRadioButton1.setSelected(true);
			jRadioButton1.setActionCommand("as");
			getButtonGroup().add(jRadioButton1);
		}
		return jRadioButton1;
	}

	/**
	 * This method initializes jButton
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setBounds(new Rectangle(38, 140, 60, 25));
			jButton.setText("确定");
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					Set<File> mp3s = new HashSet<File>();
					MP3Util.walk(path, mp3s);
					ButtonModel bm = getButtonGroup().getSelection();
					String command = bm.getActionCommand();
					if ("aas".equals(command)) {
						MP3GroupProgress progress = new MP3GroupProgress(null);
						progress.setVisible(true);// 不知道为什么,居然不显示
						int i = 0, length = mp3s.size();
						for (File f : mp3s) {
							i++;
							MP3Info info = MP3Util.getInfo(f);
							String artist = info.getArtist();
							if (artist == null) {
								artist = "未知歌手";
							}
							File dir = new File(path, artist);
							if (!dir.exists()) {
								dir.mkdirs();
							}
							String album = info.getAlbum();
							if (album == null) {
								album = "未知专辑";
							}
							File d = new File(dir, album);
							if (!d.exists()) {
								d.mkdirs();
							}
							String text = "";
							if (!f.getParentFile().equals(d)) {
								if (MP3Util.move(f, d)) {
									text = "移动文件 " + f.getName() + " 到 "
											+ d.getPath() + " 下";
								} else {
									text = "无法移动文件 " + f.getName();
								}
							} else {
								text = "文件 " + f.getName() + " 不需要移动";
							}
							System.out.println(text);
							progress.getJProgressBar().setString(text);
							progress.getJProgressBar()
									.setValue((int) (i * 100 / length));
						}
					} else if ("as".equals(command)) {
						MP3GroupProgress progress = new MP3GroupProgress(null);
						progress.setVisible(true);
						int i = 0, length = mp3s.size();
						for (File f : mp3s) {
							i++;
							MP3Info info = MP3Util.getInfo(f);
							String artist = info.getArtist();
							if (artist == null) {
								artist = "未知歌手";
							}
							File d = new File(path, artist);
							if (!d.exists()) {
								d.mkdirs();
							}
							String text = "";
							if (!f.getParentFile().equals(d)) {
								if (MP3Util.move(f, d)) {
									text = "移动文件 " + f.getName() + " 到 "
											+ d.getPath() + " 下";
								} else {
									text = "无法移动文件 " + f.getName();
								}
							} else {
								text = "文件 " + f.getName() + " 不需要移动";
							}
							System.out.println(text);
							progress.getJProgressBar().setString(text);
							progress.getJProgressBar()
									.setValue((int) (i * 100 / length));
						}
					}
					MP3GroupDialog.this.dispose();
				}
			});
		}
		return jButton;
	}

	/**
	 * This method initializes jButton1
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getJButton1() {
		if (jButton1 == null) {
			jButton1 = new JButton();
			jButton1.setBounds(new Rectangle(138, 140, 60, 25));
			jButton1.setText("取消");
			jButton1.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					MP3GroupDialog.this.dispose();
				}
			});
		}
		return jButton1;
	}

	private ButtonGroup getButtonGroup() {
		if (buttonGroup == null) {
			buttonGroup = new ButtonGroup();
		}
		return buttonGroup;
	}

} // @jve:decl-index=0:visual-constraint="10,10"

 

 

然后是工具类

 

package com.javaeye.i2534;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.util.Collection;

public final class MP3Util {

	private MP3Util() {};

	public static MP3Info getInfo(File file) {
		RandomAccessFile raf = null;
		try {
			raf = new RandomAccessFile(file, "r");
			byte[] array = new byte[128];
			raf.seek(raf.length() - 128);
			raf.read(array);
			MP3Info info = new MP3Info(array);
			return info;
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		} catch (IllegalArgumentException e1) {
			e1.printStackTrace();
		} finally {
			if (raf != null) {
				try {
					raf.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}
		return null;
	}

	/**
	 * 遍历文件,获取所有后缀为mp3的文件
	 * 
	 * @param file
	 * @param files
	 */
	public static void walk(File file, Collection<File> files) {
		if (file.isHidden()) {
			return;
		}
		if (file.isDirectory()) {
			for (File f : file.listFiles()) {
				MP3Util.walk(f, files);
			}
		} else if (file.isFile()) {
			if (file.getName().toLowerCase().endsWith(".mp3")) {
				files.add(file);
			}
		}
	}

	public static boolean move(File f, File dir) {
		if (f.exists() && f.isFile()) {
			try {
				RandomAccessFile raf = new RandomAccessFile(f, "r");
				FileChannel fc = raf.getChannel();
				RandomAccessFile wr = new RandomAccessFile(new File(dir, f
						.getName()), "rw");
				FileChannel wfc = wr.getChannel();
				fc.transferTo(0, fc.size(), wfc);
				wfc.close();
				raf.close();
				return f.delete();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return false;
	}
}

 

 

最后是一个不能正常工作的进度条.....

 

package com.javaeye.i2534;

import java.awt.BorderLayout;
import java.awt.Cursor;

import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JWindow;

public class MP3GroupProgress extends JWindow {

	private static final long	serialVersionUID	= 1L;
	private JPanel				jContentPane		= null;
	private JPanel				jPanel				= null;
	private JProgressBar		jProgressBar		= null;

	/**
	 * This method initializes jPanel
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new BorderLayout());
			jPanel.add(getJProgressBar(), BorderLayout.CENTER);
		}
		return jPanel;
	}

	/**
	 * This method initializes jProgressBar
	 * 
	 * @return javax.swing.JProgressBar
	 */
	public JProgressBar getJProgressBar() {
		if (jProgressBar == null) {
			jProgressBar = new JProgressBar(1, 100);
			jProgressBar.setStringPainted(true);
		}
		return jProgressBar;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		final MP3GroupProgress p = new MP3GroupProgress(null);
		p.setVisible(true);
		new Thread() {
			public void run() {
				for (int i = 0; i < 100; i++) {
					p.getJProgressBar().setString("Now " + i);
					p.getJProgressBar().setValue(i);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();
	}

	/**
	 * @param owner
	 */
	public MP3GroupProgress(JDialog owner) {
		initialize();
		this.setLocationRelativeTo(owner);
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(474, 45);
		this.setContentPane(getJContentPane());
		this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJPanel(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

} // @jve:decl-index=0:visual-constraint="10,10"
  • src.zip (10.2 KB)
  • 下载次数: 246
分享到:
评论
13 楼 i2534 2010-04-26  
Angel_Night 写道
我觉得抱怨swing美观,或者觉得是玩具的..没意义..

领会精神..我非常喜欢这种所谓的"java程序员的解决方式"

就好像前些天有一哥们写了一个电驴下载完毕直接关机的程序
虽然不如用脚本简洁

但是这是一种精神

哥们说到我心里去了,我就是一个java程序员,我就喜欢用java来解决遇到的问题,虽然可能已经有更好的解决办法了,但是路不都是人走出来的么,我为什么就不能再走一条路,虽然可能会头破血流...
12 楼 Angel_Night 2010-04-26  
我觉得抱怨swing美观,或者觉得是玩具的..没意义..

领会精神..我非常喜欢这种所谓的"java程序员的解决方式"

就好像前些天有一哥们写了一个电驴下载完毕直接关机的程序
虽然不如用脚本简洁

但是这是一种精神
11 楼 i2534 2010-04-26  
whaosoft 写道
唉 就是不老美观的 不过我也只是说说 我做的swing的东西比你的也好看不了

这个是很多程序员没办法的事,需要大量美工支持,你知道的,现在美工太贵了,比程序本身都贵
10 楼 i2534 2010-04-26  
gml520 写道
问题不少阿,经常报异常!估计楼主还没有对mp3 分析透彻~ ,期待楼主进一步改进~

是有很多问题,这个不是专业的工具,mp3的标签分为好几种,我只是处理了我自己硬盘的,因为我的歌都是从巨鲸和qq音乐上下的,标签都是这个,都很规范
9 楼 i2534 2010-04-26  
xiaoyiz 写道
硬盘内的mp3文件太多了,下的时候没有归类,结果比较乱,就自己写了个小程序分拣.上代码:

...楼主的精神可嘉可是能用简单的方法就用最简单的方法解决

如果你使用windows, Win+F ---》输入 *.mp3-->回车 搜索出所有MP3文件。。。岂不是更简单?更省心?


这样能把各个文件放进歌手文件夹吗?
8 楼 i2534 2010-04-26  
kjj 写道
吃力不讨好的工作,很多mp3根本没有id3信息,这些只能是个玩具吧!!

对,这个还真是个玩具,自己拿来分类本地歌曲的.
7 楼 kjj 2010-04-26  
吃力不讨好的工作,很多mp3根本没有id3信息,这些只能是个玩具吧!!
6 楼 xiaoyiz 2010-04-25  
硬盘内的mp3文件太多了,下的时候没有归类,结果比较乱,就自己写了个小程序分拣.上代码:

...楼主的精神可嘉可是能用简单的方法就用最简单的方法解决

如果你使用windows, Win+F ---》输入 *.mp3-->回车 搜索出所有MP3文件。。。岂不是更简单?更省心?
5 楼 gml520 2010-04-25  
问题不少阿,经常报异常!估计楼主还没有对mp3 分析透彻~ ,期待楼主进一步改进~
4 楼 whaosoft 2010-04-25  
唉 就是不老美观的 不过我也只是说说 我做的swing的东西比你的也好看不了
3 楼 wtotal 2010-04-24  
估计结果会有很多未分类的歌曲。
2 楼 skyyks0001 2010-04-24  
看了看 只支持id3v1 现在大多数都是id3v2了 有的mp3甚至没有id3v1标签
1 楼 greatghoul 2010-04-24  
正限机子上mp3也比较乱,顺便研究下你的代码。如果把歌曲名,专辑名等都做成参数的形式,那就可以自定义名字了,不限于你当前提供了两种。可以随意组合。

相关推荐

    三菱Q系列PLC物流分拣程序源码

    资源名:三菱PLC物流分拣程序源码 资源类型:程序源代码 源码说明: 每个分拣道口之前有个对射光电,通过三菱Q系列PLC的数据表格指令来实现包裹的自动分拣到每个不同的道口。 适合人群:新手及有一定经验的开发人员

    物流分拣程序(三菱QPLC)

    每个分拣道口之前有个对射光电,通过三菱Q系列PLC的数据表格指令来实现包裹的自动分拣到每个不同的道口。

    陈帅-东风快递地址分拣程序.py

    简单的数据处理分析

    库卡机器人分拣程序

    一个库卡按需物料抓取程序.3.1版本,两种物料的需求量随便变化托盘物料数量可以增加外部自动程序。带初始化

    机器人分拣工作站PLC控制程序(西门子)

    《机器人分拣工作站PLC控制程序(西门子)详解》 在自动化行业中,PLC(可编程逻辑控制器)扮演着至关重要的角色,它能够精确地控制设备的运行,提高生产效率。本篇将深入探讨一个针对“机器人分拣工作站”的西门子...

    流分拣程序.rar_plc分拣_分拣_分拣控制_分拣系统_物流分拣

    标题“流分拣程序.rar_plc分拣_分拣_分拣控制_分拣系统_物流分拣”揭示了这个压缩包文件的核心内容,即一个基于PLC的物流分拣程序设计。描述中的“plc控制系统,plc物流分拣控制系统”进一步强调了PLC在物流分拣系统...

    PLC 颜色分拣实验程序

    PLC 颜色分拣实验程序

    两斜槽成套分拣_分拣设备程序_fx3uPLC_fx3u_PLC程序_

    标题中的“两斜槽成套分拣_分拣设备程序_fx3uPLC_fx3u_PLC程序_”表明这是一个关于使用三菱FX3U PLC控制的分拣系统,特别是涉及两个倾斜槽的分拣设备。这个系统可能用于自动化生产线上的物品分类、定向或分配。下面...

    颜色分拣程序

    别人的颜色分拣机程序使用lego自带的软件编制的

    C++毕业设计快递分拣机器人系统源码.zip

    C++毕业设计快递分拣机器人系统源码实现一个快递分拣机器人。基于OpenCV图像识别技术实现快递信息的识别以及二维码的道路节点信息识别,9轴陀螺仪的姿态获取技术来作为底层小车的运动控制实现直走以及精确的转向,...

    重量分拣仿真 博途1500程序及设计说明,Factory IO场景

    重量分拣仿真项目,博途1500程序及设计说明,Factory IO场景 在这个场景中我们需要实现通过此部分的物料可以被测重并通过中间的分拣装置分拣到三个方向的传送带上面。控制柜需要实现手动单次分拣与自动多次分拣的...

    称重分拣触摸屏程序

    标题中的“称重分拣触摸屏程序”指的是用于工业自动化领域的控制系统,特别是涉及物流、生产线上物品重量检测和分类的设备。触摸屏程序是该系统的人机交互界面,允许操作员直观地输入指令和查看设备运行状态。威纶MT...

    PLC-chuangsong.rar_PLC_PLC 分拣_plc分拣_分拣_分拣 PLC

    压缩包内的“传送分拣”可能是项目文件名,可能包含具体的PLC程序代码、工程配置、图纸或者教程文档,这些内容会详细展示如何通过PLC来控制分拣系统的传送部分,可能涉及传感器检测、电机驱动、逻辑控制等多个方面。...

    FX5U-机械手_分拣程序.rar

    标题 "FX5U-机械手_分拣程序.rar" 暗示了这是一个与FX5U系列PLC(可编程逻辑控制器)相关的项目,其中包含了用于控制机械手进行分拣任务的程序。FX5U是三菱电机推出的一种高级微型PLC,具有强大的处理能力和丰富的...

    基于PLC控制的多肉分拣系统研究.pdf

    主程序负责系统初始化和启动/停止控制,指示灯子程序控制系统运行指示灯,而分拣子程序是整个程序的核心。分拣子程序通过光电传感器检测到的信号来控制变频器的启停,变频器进而控制传送带,实现对多肉植物尺寸分类...

    基于三菱PLC控制的物料分拣系统设计与实现.pdf

    在实际应用中,可通过简单的程序修改,实现对不同物料的分拣,这使得系统具有较高的灵活性和适应性,符合现代工业自动化生产的需求。 作为参考文献,本文所描述的物料分拣系统设计与实现的相关技术与方法,可以为...

    联机程序(三菱)\分拣站程序

    在这个分拣站程序中,我们可能使用的是FX系列,因为这类小型PLC适合控制简单到中等复杂的系统,如分拣线。 分拣站程序的设计通常包括以下几个关键部分: 1. 输入/输出(I/O)配置:PLC需要接收来自传感器、按钮和...

    基于PLC的多物料检测与分拣程序设计.pdf

    本文以亚龙集团生产的YL-235A机电一体化设备为基础,针对输送带上同时出现的四个物料(金属物料、白色物料和黑色物料等),提出了相应的检测与分拣的控制要求,并给出了一套基于PLC的检测与分拣程序设计方案。...

    料箱输送线程序,有合流和分拣, 精华部分是WCS和PLC的Socket接口和分拣控制程序 提供设备布局图和电气图纸以及博途V16

    料箱输送线程序,有合流和分拣, 精华部分是WCS和PLC的Socket接口和分拣控制程序 提供设备布局图和电气图纸以及博途V16程序。 程序源自欧企,无加密,外企程序还是比较美观的,程序仅供学习参考,不讲解 硬件配置:...

    摆轮分拣线程序1500PLC

    摆轮分拣线程序1500PLC是工业自动化领域中常见的应用,主要用于物流、仓储等行业的货物分拣作业。这里的"1500PLC"通常指的是西门子S7-1500系列的可编程逻辑控制器,这是一种高性能、高可靠性的工业控制设备。西门子...

Global site tag (gtag.js) - Google Analytics